Skip to content

Commit

Permalink
fix: [codegeex] update interface
Browse files Browse the repository at this point in the history
update interface
fix some issues

Log: as title
  • Loading branch information
LiHua000 authored and deepin-ci-robot committed Oct 22, 2024
1 parent 7d84faa commit 91d579d
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 40 deletions.
2 changes: 1 addition & 1 deletion src/base/abstractlocator.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ struct baseLocatorItem
{
public:
explicit baseLocatorItem(abstractLocator *parentLocator)
: locator(parentLocator) {}
: locator(parentLocator), displayName(""), id(""), extraInfo(""), tooltip(""), data(QVariant()), icon(QIcon()) {}

QString displayName;
QString id;
Expand Down
34 changes: 23 additions & 11 deletions src/plugins/codegeex/codegeex/askapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include "src/common/supportfile/language.h"
#include "services/project/projectservice.h"
#include "services/window/windowservice.h"
#include "services/editor/editorservice.h"
#include "common/type/constants.h"

#include <QNetworkAccessManager>
#include <QNetworkReply>
Expand Down Expand Up @@ -93,6 +95,7 @@ void AskApiPrivate::processResponse(QNetworkReply *reply)
QStringList lines = replyMsg.split('\n');
QString event;
QString id;

for (const auto &line : lines) {
auto index = line.indexOf(':');
auto key = line.mid(0, index);
Expand All @@ -106,17 +109,17 @@ void AskApiPrivate::processResponse(QNetworkReply *reply)
QJsonParseError error;
QJsonDocument jsonDocument = QJsonDocument::fromJson(value.toUtf8(), &error);

QJsonObject jsonObject = jsonDocument.object();
auto entry = processJsonObject(event, &jsonObject);
if (error.error != QJsonParseError::NoError) {
qCritical() << "JSON parse error: " << error.errorString();
if (event == "finish") {
emit q->response(id, "", event);
emit q->response(id, entry.text, event);
return;
}
continue;
}

QJsonObject jsonObject = jsonDocument.object();
auto entry = processJsonObject(event, &jsonObject);
if (entry.type == "crawl")
emit q->crawledWebsite(id, entry.websites);
else
Expand Down Expand Up @@ -178,10 +181,10 @@ QByteArray AskApiPrivate::assembleSSEChatBody(const QString &prompt, const QStri
const QJsonArray &history, const QString &talkId)
{
QJsonObject jsonObject;

jsonObject.insert("ide", qApp->applicationName());
jsonObject.insert("ide_version", version());
jsonObject.insert("prompt", prompt);
jsonObject.insert("machineId", machineId);
//jsonObject.insert("client", "deepin-unioncode");
jsonObject.insert("history", history);
jsonObject.insert("locale", locale);
jsonObject.insert("model", model);
Expand All @@ -191,10 +194,9 @@ QByteArray AskApiPrivate::assembleSSEChatBody(const QString &prompt, const QStri
auto currentProjectPath = prjService->getActiveProjectInfo().workspaceFolder();

if (codebaseEnabled && currentProjectPath != "") {
QJsonObject result = CodeGeeXManager::instance()->query(currentProjectPath, prompt, 20);
QJsonObject result = CodeGeeXManager::instance()->query(currentProjectPath, prompt, 50);
QJsonArray chunks = result["Chunks"].toArray();
if (!chunks.isEmpty()) {
CodeGeeXManager::instance()->cleanHistoryMessage(); // incase history is too big
if (result["Completed"].toBool() == false)
emit q->notify(0, CodeGeeXManager::tr("The indexing of project %1 has not been completed, which may cause the results to be inaccurate.").arg(currentProjectPath));
jsonObject["history"] = QJsonArray();
Expand All @@ -221,7 +223,7 @@ QByteArray AskApiPrivate::assembleSSEChatBody(const QString &prompt, const QStri
files["files"] = fileDatas;
jsonObject.insert("files", files);
} else if (networkEnabled)
jsonObject.insert("command", "online_search");
jsonObject.insert("command", "online_search_v1");

if (!talkId.isEmpty())
jsonObject.insert("talkId", talkId);
Expand Down Expand Up @@ -267,14 +269,22 @@ QJsonObject AskApiPrivate::toJsonOBject(QNetworkReply *reply)
QJsonArray AskApiPrivate::parseFile(QStringList files)
{
QJsonArray result;
auto editorSrv = dpfGetService(dpfservice::EditorService);

for (auto file : files) {
QJsonObject obj;
obj["name"] = QFileInfo(file).fileName();
obj["language"] = support_file::Language::id(file);
QFile content(file);
if (content.open(QIODevice::ReadOnly)) {
obj["content"] = QString(content.read(20000));

QString fileContent = editorSrv->fileText(file);

if (fileContent.isEmpty()) {
QFile content(file);
if (content.open(QIODevice::ReadOnly)) {
obj["content"] = QString(content.read(20000));
}
} else {
obj["content"] = QString(fileContent.mid(0, 20000));
}
result.append(obj);
}
Expand Down Expand Up @@ -409,6 +419,7 @@ void AskApi::postNewSession(const QString &url,
const QString &prompt,
const QString &talkId)
{
d->terminated = false;
QByteArray body = d->assembleNewSessionBody(prompt, talkId);
QNetworkReply *reply = d->postMessage(url, token, body);
connect(reply, &QNetworkReply::finished, [=]() {
Expand Down Expand Up @@ -481,6 +492,7 @@ void AskApi::getMessageList(const QString &url, const QString &token, int pageNu

void AskApi::deleteSessions(const QString &url, const QString &token, const QStringList &talkIds)
{
d->terminated = false;
QByteArray body = d->assembleDelSessionBody(talkIds);
QNetworkReply *reply = d->postMessage(url, token, body);
connect(reply, &QNetworkReply::finished, [=]() {
Expand Down
82 changes: 78 additions & 4 deletions src/plugins/codegeex/codegeex/copilotapi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,18 +67,38 @@ void CopilotApi::postComment(const QString &url,
processResponse(reply);
}

void CopilotApi::postInlineChat(const QString &url,
const QString &prompt,
const InlineChatInfo &info,
const QString &locale)
{
QByteArray body = assembleInlineChatBody(prompt, info, locale);
QNetworkReply *reply = postMessage(url, CodeGeeXManager::instance()->getSessionId(), body);
reply->setProperty("responseType", CopilotApi::receiving_by_stream);

processResponse(reply);
}

void CopilotApi::postCommit(const QString &url,
const CommitMessage &message,
const QString &locale)
{
QByteArray body = assembleCommitBody(message, locale);
QNetworkReply *reply = postMessage(url, CodeGeeXManager::instance()->getSessionId(), body);
reply->setProperty("responseType", CopilotApi::receiving_by_stream);

processResponse(reply);
}

void CopilotApi::postCommand(const QString &url,
const QString &code,
const QString &locale,
const QString &command)
{
if (CodeGeeXManager::instance()->checkRunningState(true))
return;
QByteArray body = assembleCommandBody(code, locale, command);
QNetworkReply *reply = postMessage(url, CodeGeeXManager::instance()->getSessionId(), body);
reply->setProperty("responseType", CopilotApi::receiving_by_stream);

emit messageSended();
processResponse(reply);
}

Expand Down Expand Up @@ -141,6 +161,8 @@ QByteArray CopilotApi::assembleGenerateBody(const QString &prefix, const QString
}

QJsonObject json;
json.insert("ide", qApp->applicationName());
json.insert("ide_version", version());
json.insert("context", context);
json.insert("model", completionModel);
json.insert("lang", file.second);
Expand All @@ -156,6 +178,8 @@ QByteArray CopilotApi::assembleGenerateBody(const QString &prefix, const QString
QByteArray CopilotApi::assembleTranslateBody(const QString &code, const QString &dst_lang, const QString &locale)
{
QJsonObject json;
json.insert("ide", qApp->applicationName());
json.insert("ide_version", version());
json.insert("lang", dst_lang);
json.insert("code", code);
json.insert("command", "translation");
Expand All @@ -166,9 +190,58 @@ QByteArray CopilotApi::assembleTranslateBody(const QString &code, const QString
return doc.toJson();
}

QByteArray CopilotApi::assembleInlineChatBody(const QString &prompt, const InlineChatInfo &info, const QString &locale)
{
auto file = getCurrentFileInfo();

QJsonObject json;
json.insert("ide", qApp->applicationName());
json.insert("ide_version", version());
json.insert("lang", file.second);
json.insert("code", info.selectedCode);
json.insert("command", "inline_chat");
json.insert("locale", locale);
json.insert("model", chatModel);
json.insert("prompt", prompt);

QJsonObject inline_chat_obj;
inline_chat_obj.insert("is_ast", info.is_ast);
inline_chat_obj.insert("file_name", info.fileName);
inline_chat_obj.insert("package_code", info.package_code);
inline_chat_obj.insert("class_function", info.class_function);
inline_chat_obj.insert("context_code", info.contextCode);

json.insert("inline_chat", inline_chat_obj);
QJsonDocument doc(json);
return doc.toJson();
}

QByteArray CopilotApi::assembleCommitBody(const CommitMessage &message, const QString &locale)
{
QJsonObject json;
json.insert("ide", qApp->applicationName());
json.insert("ide_version", version());
json.insert("command", "commit_message_v1");
json.insert("talkId", CodeGeeXManager::instance()->getTalkId());
json.insert("locale", locale);
json.insert("model", chatModel);

QJsonObject commitObj;
commitObj.insert("git_diff", message.git_diff);
commitObj.insert("commit_history", message.commit_history);
commitObj.insert("commit_type", message.commit_type);

json.insert("commit_message", commitObj);

QJsonDocument doc(json);
return doc.toJson();
}

QByteArray CopilotApi::assembleCommandBody(const QString &code, const QString &locale, const QString &command)
{
QJsonObject json;
json.insert("ide", qApp->applicationName());
json.insert("ide_version", version());
json.insert("command", command);
json.insert("code", code);
json.insert("talkId", CodeGeeXManager::instance()->getTalkId());
Expand All @@ -182,7 +255,7 @@ QByteArray CopilotApi::assembleCommandBody(const QString &code, const QString &l
void CopilotApi::processResponse(QNetworkReply *reply)
{
if (reply->property("responseType") == CopilotApi::receiving_by_stream) {
connect(CodeGeeXManager::instance(), &CodeGeeXManager::requestStop, this, [=]() {
connect(this, &CopilotApi::requestStop, this, [=]() {
reply->close();
});
connect(reply, &QNetworkReply::readyRead, this, [=]() {
Expand Down Expand Up @@ -257,6 +330,7 @@ void CopilotApi::slotReadReplyStream(QNetworkReply *reply)
qCritical() << "Error:" << reply->errorString();
} else {
QString replyMsg = QString::fromUtf8(reply->readAll());
qInfo() << replyMsg;
QStringList lines = replyMsg.split('\n');
QString data;
QString event;
Expand Down
52 changes: 52 additions & 0 deletions src/plugins/codegeex/codegeex/copilotapi.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,40 @@ static QList<QString> SupportLanguage {
"agda",
};

static const QStringList ALL_AST_LANGS = {
"javascript",
"typescript",
"javascript jsx",
"javascriptreact",
"typescript jsx",
"typescriptreact",
"go",
"ruby",
"csharp",
"c#",
"c",
"cpp",
"c++",
"java",
"rust",
"python",
};

struct InlineChatInfo {
QString fileName { "" };
QString package_code { "" }; // eg: "10 import path \n11 import os \n15 import pygame"
QString class_function { "" }; // if is_ast is false, class_function do not be set. or set it to "all class and function definition in current file"
QString selectedCode { "" }; // need to contains [cursor]
QString contextCode { "" }; // linenumber before code
bool is_ast { false }; // true when above langs contains this file type and file content > 100 lines
};

struct CommitMessage {
QString git_diff { "" };
QString commit_history { "" };
QString commit_type { "conventional" }; // conventional / auto / default
};

class CopilotApi : public QObject
{
Q_OBJECT
Expand All @@ -131,18 +165,28 @@ class CopilotApi : public QObject
const QString &code,
const QString &locale);

void postInlineChat(const QString &url,
const QString &prompt,
const InlineChatInfo &info,
const QString &locale); // codegeex: this api is non-streaming. url need to be xxx/?stream=false

void postTranslate(const QString &url,
const QString &code,
const QString &dst_lang,
const QString &locale);

void postCommit(const QString &url,
const CommitMessage &message,
const QString &locale);

void postCommand(const QString &url,
const QString &code,
const QString &locale,
const QString &command);

enum ResponseType {
inline_completions,
inline_chat,
multilingual_code_comment,
multilingual_code_translate,
receiving_by_stream
Expand All @@ -153,6 +197,7 @@ class CopilotApi : public QObject
void responseByStream(const QString &msgID, const QString &response, const QString &event);
void asyncGenerateMessages(const QString &url, const QByteArray &body);

void requestStop();
void messageSended();

public slots:
Expand All @@ -171,6 +216,13 @@ public slots:
const QString &dst_lang,
const QString &locale);

QByteArray assembleInlineChatBody(const QString &prompt,
const InlineChatInfo &info,
const QString &locale);

QByteArray assembleCommitBody(const CommitMessage &message,
const QString &locale);

QByteArray assembleCommandBody(const QString &code,
const QString &locale,
const QString &command);
Expand Down
20 changes: 12 additions & 8 deletions src/plugins/codegeex/codegeexmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,14 @@ void CodeGeeXManager::onResponse(const QString &msgID, const QString &data, cons

auto msgData = modifiedData(data);
if (event == "finish") {
if (responseData.isEmpty() && !data.isEmpty()) {
responseData = msgData;
if (!curSessionMsg.contains(msgID))
curSessionMsg.insert(msgID, MessageData(msgID, MessageData::Anwser));
curSessionMsg[msgID].updateData(responseData);
Q_EMIT requestMessageUpdate(curSessionMsg[msgID]);
}

responseData.clear();
if (!currentChat.first.isEmpty() && currentChat.second.isEmpty()) {
currentChat.second = msgData;
Expand Down Expand Up @@ -296,19 +304,14 @@ void CodeGeeXManager::showHistoryMessage(const QVector<AskApi::MessageRecord> &r
for (auto index = records.size() - 1; index >= 0; index--) {
auto messageId = QString::number(QDateTime::currentMSecsSinceEpoch());
auto record = records[index];

MessageData askData(messageId + "Ask", MessageData::Ask);
askData.updateData(record.input);
Q_EMIT requestMessageUpdate(askData);

//正常情况下,答案从网络回复中流式解析。这里如果一次性发送,无法解析代码,需要以流式方式发送,读的长度过长可能会导致解析"```"标志时吞掉其他字符
MessageData ansData(messageId + "Anwser", MessageData::Anwser);
QTextStream stream(&record.output);
QString anwser;
while (!stream.atEnd()) {
anwser += stream.read(3);
ansData.updateData(anwser);
Q_EMIT requestMessageUpdate(ansData);
}
ansData.updateData(record.output);
Q_EMIT requestMessageUpdate(ansData);
}
}

Expand Down Expand Up @@ -354,6 +357,7 @@ void CodeGeeXManager::initConnections()
connect(Copilot::instance(), &Copilot::messageSended, this, &CodeGeeXManager::startReceiving);

connect(this, &CodeGeeXManager::requestStop, &askApi, &AskApi::stopReceive);
connect(this, &CodeGeeXManager::requestStop, Copilot::instance(), &Copilot::requestStop);
connect(this, &CodeGeeXManager::notify, this, [](int type, const QString &message) {
WindowService *windowService = dpfGetService(WindowService);
windowService->notify(type, "Ai", message, QStringList {});
Expand Down
Loading

0 comments on commit 91d579d

Please sign in to comment.