Skip to content

Commit

Permalink
Refactoring and CD
Browse files Browse the repository at this point in the history
Signed-off-by: Igor Sachivka <juicy.igor@gmail.com>
  • Loading branch information
isachivka committed May 15, 2023
1 parent 028be4c commit 7e770e4
Show file tree
Hide file tree
Showing 21 changed files with 561 additions and 480 deletions.
47 changes: 47 additions & 0 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: CD

on:
push:
branches:
- master

jobs:
Build:
runs-on: ubuntu-latest
steps:
- uses: 'actions/checkout@v3'

- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: isachivka/gpt

- name: Login to DockerHub
if: github.event_name != 'pull_request'
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v1
with:
credentials_json: "${{ secrets.GOOGLE_CREDENTIALS }}"

- name: Set up Cloud SDK
uses: google-github-actions/setup-gcloud@v1

- name: Print image tags into PR
run: |
gcloud compute instances update-container gpt-tg \
--zone europe-central2-a \
--container-image=isachivka/gpt:master
20 changes: 0 additions & 20 deletions src/auth.ts

This file was deleted.

10 changes: 10 additions & 0 deletions src/bot.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { Telegraf } from "telegraf";
import { Ctx } from "./types";

console.log(process.env.BOT_KEY);

export const bot = new Telegraf(process.env.BOT_KEY);

export const send = (ctx: Ctx, text: string) => {
return bot.telegram.sendMessage(ctx.chat.id, text, {});
};
26 changes: 26 additions & 0 deletions src/const.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { gpt4Mode, imageMode, reDrawMode, textMode } from "./modes";

export const imageModeSettings = {
n: 1,
size: "512x512" as const,
};

export const reDrawModeSettings = [1, "512x512"] as const;

/*
image_mode - Image creation mode
text_mode - Chat mode
gpt4_mode - GPT-4 mode (waiting for GPT-4)
redraw_mode - Image re-draw mode
new_dialog - New dialog
set_temperature_mode - Set temperature
*/

export const commands = {
imageMode,
textMode,
gpt4Mode,
reDrawMode,
start: "start",
newDialog: "new_dialog",
};
25 changes: 0 additions & 25 deletions src/download.ts

This file was deleted.

27 changes: 27 additions & 0 deletions src/handlers/image.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { send } from "../bot";
import { textMode } from "../modes";
import { openai } from "../openai";
import { Reply, UpdateCtx } from "../types";
import { locales } from "../locales/locales";
import { usersStorage } from "../user/usersStorage";
import { imageModeSettings } from "../const";

export const imageHandler = (ctx: UpdateCtx & Reply) => {
const user = usersStorage.get(ctx.from.id);
user.changeMode(textMode);
return openai
.createImage({
prompt: ctx.update.message.text,
...imageModeSettings,
})
.then((response) => {
ctx.replyWithPhoto(response.data.data[0].url);
return send(ctx, locales.en.backToText);
})
.catch((err) => {
return Promise.all([
send(ctx, "❗️" + err.message),
send(ctx, "❗️" + err.response.data.error.message),
]);
});
};
78 changes: 78 additions & 0 deletions src/handlers/re-draw.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import * as process from "process";
import { send } from "../bot";
import { reDrawMode, textMode } from "../modes";
import { Telegram } from "telegraf";
import { downloadImage, getPaths, removeFiles } from "../utils/download";
import { openai } from "../openai";
import type { Reply, UpdateCtx, UpdateDocCtx } from "../types";
import { locales } from "../locales/locales";
import { usersStorage } from "../user/usersStorage";
import { reDrawModeSettings } from "../const";

export const reDrawHandler = (ctx: UpdateCtx & Reply) => {
const user = usersStorage.get(ctx.from.id);
const { text } = ctx.update.message;
if (
user.getUserImage() === undefined ||
user.getUserImageMask() === undefined
) {
return send(ctx, locales.en.noImage);
}

const { filePath, filePathMask } = getPaths(ctx.from.id);

Promise.all([
downloadImage(user.getUserImage().toString(), filePath),
downloadImage(user.getUserImageMask().toString(), filePathMask),
] as const).then((imgs) => {
return openai
.createImageEdit(imgs[0], text, imgs[1], ...reDrawModeSettings)
.then((response) => {
ctx.replyWithPhoto(response.data.data[0].url);
user.addUserImage();
user.addUserImageMask();
removeFiles({ filePath, filePathMask });
user.changeMode(textMode);
return send(ctx, locales.en.backToText);
})
.catch((err) => {
return Promise.all([
send(ctx, "❗️" + err.message),
send(ctx, "❗️" + err.response?.data?.error?.message),
]);
});
});
};

export const onPhotoFile = (ctx: UpdateDocCtx): boolean => {
const user = usersStorage.get(ctx.from.id);

if (ctx.update?.message?.document === undefined) {
return false;
}

if (user.getMode() !== reDrawMode) {
send(ctx, locales.en.noReDraw);
return true;
}

const telegram = new Telegram(process.env.BOT_KEY);

if (user.getUserImage() === undefined) {
telegram
.getFileLink(ctx.update?.message?.document?.file_id)
.then((link) => {
user.addUserImage(link);
return send(ctx, locales.en.giveMask);
});
} else {
telegram
.getFileLink(ctx.update?.message?.document?.file_id)
.then((link) => {
user.addUserImageMask(link);
return send(ctx, locales.en.givePrompt);
});
}

return true;
};
20 changes: 20 additions & 0 deletions src/handlers/temperature.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { UpdateCtx } from "../types";
import { locales } from "../locales/locales";
import { textMode } from "../modes";
import { send } from "../bot";
import { usersStorage } from "../user/usersStorage";

export const temperatureHandler = (ctx: UpdateCtx) => {
const user = usersStorage.get(ctx.from.id);
const text = ctx.update.message.text;
const temperature = Number(text);
if (isNaN(temperature)) {
return send(ctx, locales.en.wrongTemperature);
}
if (temperature < 0 || temperature > 2) {
return send(ctx, locales.en.wrongTemperature);
}
user.setTemperature(temperature);
user.changeMode(textMode);
return send(ctx, locales.en.ok);
};
32 changes: 32 additions & 0 deletions src/handlers/text.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import { send } from "../bot";
import { gpt4Mode, textMode } from "../modes";
import { openai } from "../openai";
import type { UpdateCtx } from "../types";
import { usersStorage } from "../user/usersStorage";

export const textHandler = (ctx: UpdateCtx) => {
const user = usersStorage.get(ctx.from.id);
user.appendHistory("user", ctx.update.message.text);

try {
return openai
.createChatCompletion({
model: user.getMode() === gpt4Mode ? "gpt-4" : "gpt-3.5-turbo",
messages: user.getHistory(),
temperature: user.getTemperature(),
})
.then((response) => {
const choice = response.data.choices[0];
user.appendHistory(choice.message.role, choice.message.content);
user.changeMode(textMode);
return send(ctx, choice.message.content);
})
.catch((error) => {
user.changeMode(textMode);
return send(ctx, "Error: " + JSON.stringify(error));
});
} catch (error) {
user.changeMode(textMode);
return send(ctx, "Error: " + JSON.stringify(error));
}
};
60 changes: 0 additions & 60 deletions src/image.ts

This file was deleted.

Loading

0 comments on commit 7e770e4

Please sign in to comment.