mirror of
https://github.com/Palm1r/QodeAssist.git
synced 2026-02-08 00:00:43 -05:00
feat: Add image support for Claude, OpenAI and Google (#268)
* feat: Add image support for Claude * feat: Add images support for OpenAI * feat: Add support images for google ai * refactor: Separate ImageComponent * feat: Add attach image button * feat: Add support image for Mistral provider * feat: Add support images for OpenAI compatible providers * feat: Add support images for Ollama
This commit is contained in:
@ -68,6 +68,54 @@ private:
|
||||
QString m_text;
|
||||
};
|
||||
|
||||
class ImageContent : public ContentBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum class ImageSourceType { Base64, Url };
|
||||
|
||||
ImageContent(const QString &data, const QString &mediaType, ImageSourceType sourceType = ImageSourceType::Base64)
|
||||
: ContentBlock()
|
||||
, m_data(data)
|
||||
, m_mediaType(mediaType)
|
||||
, m_sourceType(sourceType)
|
||||
{}
|
||||
|
||||
QString type() const override { return "image"; }
|
||||
QString data() const { return m_data; }
|
||||
QString mediaType() const { return m_mediaType; }
|
||||
ImageSourceType sourceType() const { return m_sourceType; }
|
||||
|
||||
QJsonValue toJson(ProviderFormat format) const override
|
||||
{
|
||||
if (format == ProviderFormat::Claude) {
|
||||
QJsonObject source;
|
||||
if (m_sourceType == ImageSourceType::Base64) {
|
||||
source["type"] = "base64";
|
||||
source["media_type"] = m_mediaType;
|
||||
source["data"] = m_data;
|
||||
} else {
|
||||
source["type"] = "url";
|
||||
source["url"] = m_data;
|
||||
}
|
||||
return QJsonObject{{"type", "image"}, {"source", source}};
|
||||
} else { // OpenAI format
|
||||
QJsonObject imageUrl;
|
||||
if (m_sourceType == ImageSourceType::Base64) {
|
||||
imageUrl["url"] = QString("data:%1;base64,%2").arg(m_mediaType, m_data);
|
||||
} else {
|
||||
imageUrl["url"] = m_data;
|
||||
}
|
||||
return QJsonObject{{"type", "image_url"}, {"image_url", imageUrl}};
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
QString m_data;
|
||||
QString m_mediaType;
|
||||
ImageSourceType m_sourceType;
|
||||
};
|
||||
|
||||
class ToolUseContent : public ContentBlock
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
@ -24,6 +24,15 @@
|
||||
|
||||
namespace QodeAssist::LLMCore {
|
||||
|
||||
struct ImageAttachment
|
||||
{
|
||||
QString data; // Base64 encoded data or URL
|
||||
QString mediaType; // e.g., "image/png", "image/jpeg", "image/webp", "image/gif"
|
||||
bool isUrl = false; // true if data is URL, false if base64
|
||||
|
||||
bool operator==(const ImageAttachment &) const = default;
|
||||
};
|
||||
|
||||
struct Message
|
||||
{
|
||||
QString role;
|
||||
@ -31,6 +40,7 @@ struct Message
|
||||
QString signature;
|
||||
bool isThinking = false;
|
||||
bool isRedacted = false;
|
||||
std::optional<QVector<ImageAttachment>> images;
|
||||
|
||||
// clang-format off
|
||||
bool operator==(const Message&) const = default;
|
||||
|
||||
@ -67,6 +67,7 @@ public:
|
||||
|
||||
virtual bool supportsTools() const { return false; };
|
||||
virtual bool supportThinking() const { return false; };
|
||||
virtual bool supportImage() const { return false; };
|
||||
|
||||
virtual void cancelRequest(const RequestID &requestId);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user