From 4dd137dc095a7c5475147cbc96862b0bdf8cee25 Mon Sep 17 00:00:00 2001 From: Nyako Date: Fri, 11 Sep 2026 16:37:55 +0300 Subject: [PATCH] first commit --- .gitea/workflows/ai-review.yml | 72 ++++++++++++++++++++++++++++++++++ run.py | 39 ++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 .gitea/workflows/ai-review.yml create mode 100644 run.py diff --git a/.gitea/workflows/ai-review.yml b/.gitea/workflows/ai-review.yml new file mode 100644 index 0000000..43ed23c --- /dev/null +++ b/.gitea/workflows/ai-review.yml @@ -0,0 +1,72 @@ +name: PR Diff Summary + +on: + pull_request: + types: [opened, synchronize] + +jobs: + summarize-diff: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Generate Diff and Send to OpenAI API + env: + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + # Получаем diff текущего PR относительно целевой ветки + git diff origin/${{ gitea.event.pull_request.base.ref }}...HEAD > pr.diff + + # Ограничиваем размер диффа, чтобы не превысить лимиты контекста (первые ~1200 строк) + head -n 1200 pr.diff > pr_trimmed.diff + + # Подготовка системного промпта + SYSTEM_PROMPT="Ты — автоматический анализатор кода. Твоя единственная задача — дать краткую, точную сводку изменений на русском языке.\n\nПРАВИЛА:\n1. Описывай ТОЛЬКО то, что фактически изменилось.\n2. НЕ ДАВАЙ никаких рекомендаций, советов, критики или указаний на ошибки.\n3. Пиши кратко списком (bullet points)." + + # Экранируем diff для безопасной вставки в JSON + DIFF_ESCAPED=$(jq -sR . pr_trimmed.diff) + + # Формируем JSON-нагрузку + PAYLOAD=$(jq -n \ + --arg model "claude-sonnet-4-6" \ + --arg sys "$SYSTEM_PROMPT" \ + --arg diff "$DIFF_ESCAPED" \ + '{ + model: $model, + messages: [ + {role: "system", content: $sys}, + {role: "user", content: ("Вот diff изменений:\n\n" + $diff)} + ], + temperature: 0.2 + }') + + # Запрос к OpenAI API + RESPONSE=$(curl -s https://ai.arbz.lol/v1/chat/completions \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $OPENAI_API_KEY" \ + -d "$PAYLOAD") + + # Извлекаем ответ нейросети + SUMMARY=$(echo "$RESPONSE" | jq -r '.choices[0].message.content') + + if [ -z "$SUMMARY" ] || [ "$SUMMARY" == "null" ]; then + echo "Ошибка получения ответа от API:" + echo "$RESPONSE" + exit 1 + fi + + # Добавляем заголовок и публиуем комментарий в PR через Gitea API + COMMENT_BODY=$(jq -n --arg body "### 📝 Краткий обзор изменений\n\n$SUMMARY" '{body: $body}') + + PR_INDEX="${{ gitea.event.pull_request.number }}" + REPO="${{ gitea.repository }}" + SERVER_URL="${{ gitea.server_url }}" + + curl -s -X POST "$SERVER_URL/api/v1/repos/$REPO/issues/$PR_INDEX/comments" \ + -H "Content-Type: application/json" \ + -H "Authorization: token $GITEA_TOKEN" \ + -d "$COMMENT_BODY" \ No newline at end of file diff --git a/run.py b/run.py new file mode 100644 index 0000000..9989a23 --- /dev/null +++ b/run.py @@ -0,0 +1,39 @@ +import os +import requests +from urllib.parse import unquote, urlparse + +# Список URL для скачивания +URL_LIST = [ + "https://example.com/sample.pdf", + "https://example.com/image.png", +] + +# Папка для сохранения +SAVE_DIR = "/dw" + + +def download_files(urls, destination_folder): + # Создаем папку, если она не существует + os.makedirs(destination_folder, exist_ok=True) + + for url in urls: + # Извлекаем имя файла из URL + parsed_url = urlparse(url) + filename = os.path.basename(unquote(parsed_url.path)) or "downloaded_file" + save_path = os.path.join(destination_folder, filename) + + try: + response = requests.get(url, stream=True, timeout=15) + response.raise_for_status() + + with open(save_path, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + + print(f"Сохранен: {save_path}") + except Exception as e: + print(f"Ошибка при скачивании {url}: {e}") + + +if __name__ == "__main__": + download_files(URL_LIST, SAVE_DIR) \ No newline at end of file