mirror of
				https://github.com/nomic-ai/gpt4all.git
				synced 2025-11-03 23:47:16 +00:00 
			
		
		
		
	Add txt and markdown files to attach feature. (#3135)
Signed-off-by: Adam Treat <treat.adam@gmail.com> Signed-off-by: AT <manyoso@users.noreply.github.com> Co-authored-by: Jared Van Bortel <jared@nomic.ai>
This commit is contained in:
		@@ -7,6 +7,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
 | 
			
		||||
## [Unreleased]
 | 
			
		||||
 | 
			
		||||
### Added
 | 
			
		||||
- Add ability to attach text, markdown, and rst files to chat ([#3135](https://github.com/nomic-ai/gpt4all/pull/3135))
 | 
			
		||||
- Add feature to minimize to system tray (by [@bgallois](https://github.com/bgallois) in ([#3109](https://github.com/nomic-ai/gpt4all/pull/3109))
 | 
			
		||||
 | 
			
		||||
### Changed
 | 
			
		||||
 
 | 
			
		||||
@@ -218,6 +218,7 @@ qt_add_qml_module(chat
 | 
			
		||||
      qml/MyDialog.qml
 | 
			
		||||
      qml/MyDirectoryField.qml
 | 
			
		||||
      qml/MyFileDialog.qml
 | 
			
		||||
      qml/MyFileIcon.qml
 | 
			
		||||
      qml/MyFolderDialog.qml
 | 
			
		||||
      qml/MyFancyLink.qml
 | 
			
		||||
      qml/MyMenu.qml
 | 
			
		||||
@@ -252,6 +253,7 @@ qt_add_qml_module(chat
 | 
			
		||||
      icons/eject.svg
 | 
			
		||||
      icons/email.svg
 | 
			
		||||
      icons/file-doc.svg
 | 
			
		||||
      icons/file-docx.svg
 | 
			
		||||
      icons/file-md.svg
 | 
			
		||||
      icons/file-pdf.svg
 | 
			
		||||
      icons/file-txt.svg
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								gpt4all-chat/icons/file-docx.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								gpt4all-chat/icons/file-docx.svg
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="152" y1="96" x2="208" y2="96" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="152" y1="160" x2="208" y2="160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M64,72V40a8,8,0,0,1,8-8H200a8,8,0,0,1,8,8V216a8,8,0,0,1-8,8H72a8,8,0,0,1-8-8V184" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><polyline points="64 104 76 152 92 120 108 152 120 104" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><rect x="32" y="72" width="120" height="112" rx="8" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg>
 | 
			
		||||
| 
		 After Width: | Height: | Size: 893 B  | 
@@ -915,30 +915,12 @@ Rectangle {
 | 
			
		||||
                                                    anchors.fill: parent
 | 
			
		||||
                                                    anchors.margins: 5
 | 
			
		||||
 | 
			
		||||
                                                    Item {
 | 
			
		||||
                                                        id: attachmentFileIcon
 | 
			
		||||
                                                        width: 40
 | 
			
		||||
                                                        height: 40
 | 
			
		||||
                                                        Image {
 | 
			
		||||
                                                            id: fileIcon
 | 
			
		||||
                                                            anchors.fill: parent
 | 
			
		||||
                                                            visible: false
 | 
			
		||||
                                                            sourceSize.width: 40
 | 
			
		||||
                                                            sourceSize.height: 40
 | 
			
		||||
                                                            mipmap: true
 | 
			
		||||
                                                            source: {
 | 
			
		||||
                                                                return "qrc:/gpt4all/icons/file-xls.svg"
 | 
			
		||||
                                                            }
 | 
			
		||||
                                                        }
 | 
			
		||||
                                                        ColorOverlay {
 | 
			
		||||
                                                            anchors.fill: fileIcon
 | 
			
		||||
                                                            source: fileIcon
 | 
			
		||||
                                                            color: theme.textColor
 | 
			
		||||
                                                        }
 | 
			
		||||
                                                    MyFileIcon {
 | 
			
		||||
                                                        iconSize: 40
 | 
			
		||||
                                                        fileName: modelData.file
 | 
			
		||||
                                                    }
 | 
			
		||||
 | 
			
		||||
                                                    Text {
 | 
			
		||||
                                                        id: attachmentFileText
 | 
			
		||||
                                                        width: 295
 | 
			
		||||
                                                        height: 40
 | 
			
		||||
                                                        text: modelData.file
 | 
			
		||||
@@ -1343,32 +1325,11 @@ Rectangle {
 | 
			
		||||
                                                        id: title
 | 
			
		||||
                                                        spacing: 5
 | 
			
		||||
                                                        Layout.maximumWidth: 180
 | 
			
		||||
                                                        Item {
 | 
			
		||||
                                                            Layout.preferredWidth: 24
 | 
			
		||||
                                                            Layout.preferredHeight: 24
 | 
			
		||||
                                                            Image {
 | 
			
		||||
                                                                id: fileIcon
 | 
			
		||||
                                                                anchors.fill: parent
 | 
			
		||||
                                                                visible: false
 | 
			
		||||
                                                                sourceSize.width: 24
 | 
			
		||||
                                                                sourceSize.height: 24
 | 
			
		||||
                                                                mipmap: true
 | 
			
		||||
                                                                source: {
 | 
			
		||||
                                                                    if (modelData.file.toLowerCase().endsWith(".txt"))
 | 
			
		||||
                                                                        return "qrc:/gpt4all/icons/file-txt.svg"
 | 
			
		||||
                                                                    else if (modelData.file.toLowerCase().endsWith(".pdf"))
 | 
			
		||||
                                                                        return "qrc:/gpt4all/icons/file-pdf.svg"
 | 
			
		||||
                                                                    else if (modelData.file.toLowerCase().endsWith(".md"))
 | 
			
		||||
                                                                        return "qrc:/gpt4all/icons/file-md.svg"
 | 
			
		||||
                                                                    else
 | 
			
		||||
                                                                        return "qrc:/gpt4all/icons/file.svg"
 | 
			
		||||
                                                                }
 | 
			
		||||
                                                            }
 | 
			
		||||
                                                            ColorOverlay {
 | 
			
		||||
                                                                anchors.fill: fileIcon
 | 
			
		||||
                                                                source: fileIcon
 | 
			
		||||
                                                                color: theme.textColor
 | 
			
		||||
                                                            }
 | 
			
		||||
                                                        MyFileIcon {
 | 
			
		||||
                                                            iconSize: 24
 | 
			
		||||
                                                            fileName: modelData.file
 | 
			
		||||
                                                            Layout.preferredWidth: iconSize
 | 
			
		||||
                                                            Layout.preferredHeight: iconSize
 | 
			
		||||
                                                        }
 | 
			
		||||
                                                        Text {
 | 
			
		||||
                                                            Layout.maximumWidth: 156
 | 
			
		||||
@@ -1949,30 +1910,12 @@ Rectangle {
 | 
			
		||||
                                    anchors.fill: parent
 | 
			
		||||
                                    anchors.margins: 5
 | 
			
		||||
 | 
			
		||||
                                    Item {
 | 
			
		||||
                                        id: attachmentFileIcon2
 | 
			
		||||
                                        width: 40
 | 
			
		||||
                                        height: 40
 | 
			
		||||
                                        Image {
 | 
			
		||||
                                            id: fileIcon2
 | 
			
		||||
                                            anchors.fill: parent
 | 
			
		||||
                                            visible: false
 | 
			
		||||
                                            sourceSize.width: 40
 | 
			
		||||
                                            sourceSize.height: 40
 | 
			
		||||
                                            mipmap: true
 | 
			
		||||
                                            source: {
 | 
			
		||||
                                                return "qrc:/gpt4all/icons/file-xls.svg"
 | 
			
		||||
                                            }
 | 
			
		||||
                                        }
 | 
			
		||||
                                        ColorOverlay {
 | 
			
		||||
                                            anchors.fill: fileIcon2
 | 
			
		||||
                                            source: fileIcon2
 | 
			
		||||
                                            color: theme.textColor
 | 
			
		||||
                                        }
 | 
			
		||||
                                    MyFileIcon {
 | 
			
		||||
                                        iconSize: 40
 | 
			
		||||
                                        fileName: model.file
 | 
			
		||||
                                    }
 | 
			
		||||
 | 
			
		||||
                                    Text {
 | 
			
		||||
                                        id: attachmentFileText2
 | 
			
		||||
                                        width: 265
 | 
			
		||||
                                        height: 40
 | 
			
		||||
                                        text: model.file
 | 
			
		||||
@@ -2188,7 +2131,7 @@ Rectangle {
 | 
			
		||||
 | 
			
		||||
            MyFileDialog {
 | 
			
		||||
                id: fileDialog
 | 
			
		||||
                nameFilters: ["Excel files (*.xlsx)"]
 | 
			
		||||
                nameFilters: ["All Supported Files (*.txt *.md *.rst *.xlsx)", "Text Files (*.txt *.md *.rst)", "Excel Worksheets (*.xlsx)"]
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            MyMenu {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										41
									
								
								gpt4all-chat/qml/MyFileIcon.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								gpt4all-chat/qml/MyFileIcon.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
import QtCore
 | 
			
		||||
import QtQuick
 | 
			
		||||
import QtQuick.Controls
 | 
			
		||||
import QtQuick.Controls.Basic
 | 
			
		||||
import Qt5Compat.GraphicalEffects
 | 
			
		||||
 | 
			
		||||
Item {
 | 
			
		||||
    id: fileIcon
 | 
			
		||||
    property real iconSize: 24
 | 
			
		||||
    property string fileName: ""
 | 
			
		||||
    implicitWidth: iconSize
 | 
			
		||||
    implicitHeight: iconSize
 | 
			
		||||
 | 
			
		||||
    Image {
 | 
			
		||||
        id: fileImage
 | 
			
		||||
        anchors.fill: parent
 | 
			
		||||
        visible: false
 | 
			
		||||
        sourceSize.width: iconSize
 | 
			
		||||
        sourceSize.height: iconSize
 | 
			
		||||
        mipmap: true
 | 
			
		||||
        source: {
 | 
			
		||||
            if (fileIcon.fileName.toLowerCase().endsWith(".txt"))
 | 
			
		||||
                return "qrc:/gpt4all/icons/file-txt.svg"
 | 
			
		||||
            else if (fileIcon.fileName.toLowerCase().endsWith(".pdf"))
 | 
			
		||||
                return "qrc:/gpt4all/icons/file-pdf.svg"
 | 
			
		||||
            else if (fileIcon.fileName.toLowerCase().endsWith(".md"))
 | 
			
		||||
                return "qrc:/gpt4all/icons/file-md.svg"
 | 
			
		||||
            else if (fileIcon.fileName.toLowerCase().endsWith(".xlsx"))
 | 
			
		||||
                return "qrc:/gpt4all/icons/file-xls.svg"
 | 
			
		||||
            else if (fileIcon.fileName.toLowerCase().endsWith(".docx"))
 | 
			
		||||
                return "qrc:/gpt4all/icons/file-docx.svg"
 | 
			
		||||
            else
 | 
			
		||||
                return "qrc:/gpt4all/icons/file.svg"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    ColorOverlay {
 | 
			
		||||
        anchors.fill: fileImage
 | 
			
		||||
        source: fileImage
 | 
			
		||||
        color: theme.textColor
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -132,7 +132,13 @@ void Chat::newPromptResponsePair(const QString &prompt, const QList<QUrl> &attac
 | 
			
		||||
        Q_ASSERT(url.isLocalFile());
 | 
			
		||||
        const QString localFilePath = url.toLocalFile();
 | 
			
		||||
        const QFileInfo info(localFilePath);
 | 
			
		||||
        Q_ASSERT(info.suffix() == "xlsx"); // We only support excel right now
 | 
			
		||||
 | 
			
		||||
        Q_ASSERT(
 | 
			
		||||
            info.suffix().toLower() == "xlsx" ||
 | 
			
		||||
            info.suffix().toLower() == "txt" ||
 | 
			
		||||
            info.suffix().toLower() == "md" ||
 | 
			
		||||
            info.suffix().toLower() == "rst"
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        PromptAttachment attached;
 | 
			
		||||
        attached.url = url;
 | 
			
		||||
 
 | 
			
		||||
@@ -40,6 +40,11 @@ public:
 | 
			
		||||
 | 
			
		||||
    QString processedContent() const
 | 
			
		||||
    {
 | 
			
		||||
        const QString localFilePath = url.toLocalFile();
 | 
			
		||||
        const QFileInfo info(localFilePath);
 | 
			
		||||
        if (info.suffix().toLower() != "xlsx")
 | 
			
		||||
            return u"## Attached: %1\n\n%2"_s.arg(file(), content);
 | 
			
		||||
 | 
			
		||||
        QBuffer buffer;
 | 
			
		||||
        buffer.setData(content);
 | 
			
		||||
        buffer.open(QIODevice::ReadOnly);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user