Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7505650
backend追加
sugimoto-blyukher Dec 16, 2025
c265d9a
CI workflowを追加
sugimoto-blyukher Dec 16, 2025
986e6d6
requirementsにpylintとpytestを追加
sugimoto-blyukher Dec 16, 2025
53a2774
追加
sugimoto-blyukher Dec 17, 2025
27dd251
リファクタリングと機能追加
sugimoto-blyukher Dec 17, 2025
792c786
print_pdf.sh実装
sugimoto-blyukher Dec 18, 2025
3c6bea7
print_service.pyとstore.pyの追加
sugimoto-blyukher Dec 18, 2025
6984c83
gemini_clientで使用するライブラリの変更
nigehazikizoku Dec 18, 2025
7beeb8a
print_service.pyを更新
sugimoto-blyukher Dec 18, 2025
397f9b3
main.pyの印刷ジョブ管理機能を実装し、関連する設定ファイルを追加
sugimoto-blyukher Dec 19, 2025
4aff938
設定ファイルの自動読み込みを追加し、Geminiクライアントのエラーハンドリングを改善。印刷サービスのエラー処理を強化し、レンダリングエラ…
sugimoto-blyukher Dec 19, 2025
f9c5ee5
ci.yml追加
sugimoto-blyukher Dec 19, 2025
320c80c
修正
sugimoto-blyukher Dec 19, 2025
852c144
印刷ドキュメントモデルを更新し、キラキラネームを追加。レンダリング機能を修正し、HTMLテンプレートに要点の表示を追加。
sugimoto-blyukher Dec 19, 2025
ba1e82b
Geminiに送信するプロンプトを変更
nigehazikizoku Dec 19, 2025
f241ae7
読み仮名を定義
nigehazikizoku Dec 19, 2025
c4c0069
HTML上にsubnameを追加
nigehazikizoku Dec 19, 2025
b428a93
htmlのデザイン変更、subname名称変更
nigehazikizoku Dec 20, 2025
e9f49d1
PDFデザインのデバック用ファイルの追加
nigehazikizoku Dec 20, 2025
03569b5
命名書(Naming Sheet)コンポーネント向けに、CSSカスタムプロパティを使ったスタイルを追加しました。 命名書のレイアウトとデ…
sugimoto-blyukher Dec 20, 2025
7c3990e
dev.shのHOST環境変数のデフォルト値を127.0.0.1から0.0.0.0に変更し、外部からのアクセスを許可しました。
sugimoto-blyukher Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
name: CI

on:
push:
branches: ["backend"]
pull_request:

jobs:
ci:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.13.3"]

steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
cache: "pip"
cache-dependency-path: |
backend/requirements.txt
backend/requirements-dev.txt
backend/pyproject.toml

- name: Install deps
working-directory: backend
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
if [ -f requirements-dev.txt ]; then pip install -r requirements-dev.txt; fi

- name: Lint (pylint)
run: |
pylint ./backend

- name: Test (pytest)
run: |
pytest -q


23 changes: 0 additions & 23 deletions .github/workflows/pylint.yml

This file was deleted.

8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions .idea/pre-21.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

29 changes: 29 additions & 0 deletions backend/.github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: CI

on:
push:
pull_request:

jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.13.3"
cache: pip

- name: Install dependencies
run: pip install -r requirements.txt

- name: Run tests
run: scripts/test.sh

- name: Run pylint
env:
PYLINTHOME: .pylint.d
run: pylint app
Binary file added backend/.pylint.d/app_1.stats
Binary file not shown.
13 changes: 13 additions & 0 deletions backend/.pylintrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[MASTER]
ignore-paths=.venv

[MESSAGES CONTROL]
disable=
missing-module-docstring,
missing-class-docstring,
missing-function-docstring,
broad-except,
too-few-public-methods

[FORMAT]
max-line-length=100
41 changes: 41 additions & 0 deletions backend/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Repository Guidelines

## プロジェクト構成とモジュール
- `app/`: FastAPIアプリ本体。API (`app/main.py`)、モデル、各サービス。
- `test/`: pytestのテスト一式(例: `test/test_main.py`, `test/test_store.py`)。
- `templates/`: PDF生成に使うJinja2テンプレート(`templates/index.html.j2`)。
- `scripts/`: 開発/運用向けスクリプト(`scripts/dev.sh`, `scripts/test.sh`, `scripts/print_pdf.sh`)。
- `data/`: 実行時に生成されるジョブ状態や成果物(JSON、PDF)。
- `font/`: PDFレンダリング用フォント(`font/ipamjm.ttf`)。
- `output/`: 生成物置き場。必要性が明示されない限り一時ファイル扱い。

## ビルド/テスト/開発コマンド
- `pip install -r requirements.txt`: 依存関係のインストール。
- `scripts/dev.sh`: リロード付きでFastAPIを起動(`uvicorn app.main:app`)。
- `scripts/test.sh`: pytestでテスト実行(`pytest -q`)。
- `scripts/print_pdf.sh <pdf> [copies] [printer]`: CUPSの`lp`でPDF印刷。

## コーディング規約と命名
- Python、インデントは4スペース、PEP 8準拠を意識。
- 関数/変数は`snake_case`、クラスは`PascalCase`。
- 可能な範囲で型ヒントを付与(`app/store.py`参照)。
- APIエンドポイントは`app/main.py`に集約し、追加サービスは`app/`配下へ。

## テスト方針
- フレームワーク: pytest。
- 命名規則: ファイルは`test_*.py`、関数は`test_*`。
- 実行方法: `scripts/test.sh`または`pytest -q`。
- 新規APIやジョブの状態遷移にはテスト追加を推奨。

## コミット & PR ガイドライン
- 履歴は説明的な文体(日本語が多め)。同じトーンで具体的に書く。
- PRには概要、実行したテスト、設定変更や必要な環境変数を記載。

## 設定と環境
- ローカル開発では`.env`を`app/config.py`が自動読み込み。
- 主要変数: `GEMINI_API_KEY`, `GEMINI_MODEL`, `BASE_URL`, `PRINTER_NAME`, `DATA_DIR`, `JOBS_DIR`, `IDEM_DIR`, `ARTIFACTS_DIR`。

## gemini_transformの実装方針
- ESP32から0か1のデータ5個送信されます。それに基づいて場合分けしてプロンプトを変える処理をしたいです
- 最終的にそのgemini apiにデータを送信して結果をjson形式で返します
- 整合性についてはほかファイルの仕様を優先して取ってください
Empty file added backend/app/__init__.py
Empty file.
20 changes: 20 additions & 0 deletions backend/app/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import os
from pydantic import BaseModel
from dotenv import load_dotenv

# .env を自動読み込み(ローカル開発向け)
load_dotenv()

class Settings(BaseModel):
gemini_api_key: str | None = os.getenv("GEMINI_API_KEY")
gemini_model: str = os.getenv("GEMINI_MODEL", "gemini-2.5-flash")
base_url: str = os.getenv("BASE_URL", "http://localhost:8000")
printer_name: str | None = os.getenv("PRINTER_NAME") or None

data_dir: str = os.getenv("DATA_DIR", "data")
jobs_dir: str = os.getenv("JOBS_DIR", "data/jobs")
idem_dir: str = os.getenv("IDEM_DIR", "data/idem")
llm_dir: str = os.getenv("LLM_DIR", "data/llm")
artifacts_dir: str = os.getenv("ARTIFACTS_DIR", "data/artifacts")

settings = Settings()
54 changes: 54 additions & 0 deletions backend/app/design_tool.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import argparse
import json
import os
from jinja2 import Environment, FileSystemLoader, select_autoescape, TemplateNotFound
from app.config import settings


def generate_preview(job_id: str) -> str | None:
loader = FileSystemLoader("templates")
env = Environment(
loader=loader,
autoescape=select_autoescape(["html", "xml"]),
)

llm_path = os.path.join(settings.llm_dir, f"{job_id}.json")
if not os.path.exists(llm_path):
print(f"エラー: LLMデータが見つかりません: {llm_path}")
return None

try:
template = env.get_template("default.html.j2")
except TemplateNotFound as e:
print(f"エラー: テンプレートが見つかりません。\n詳細: {e}")
return None

try:
with open(llm_path, "r", encoding="utf-8") as f:
data = json.load(f)
except json.JSONDecodeError as e:
print(f"エラー: JSONの読み込みに失敗しました。\n詳細: {e}")
return None

html_str = template.render(**data)

output_dir = os.path.join(settings.data_dir, "html")
os.makedirs(output_dir, exist_ok=True)
output_filename = os.path.join(output_dir, f"{job_id}.html")
with open(output_filename, "w", encoding="utf-8") as f:
f.write(html_str)

print("-" * 30)
print(f"成功! '{output_filename}' を作成しました。")
print("このファイルをブラウザで開いてデザインを確認してください。")
print("-" * 30)
return output_filename


if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="LLM JSONをdefault.html.j2に埋め込み、HTMLを生成します。"
)
parser.add_argument("job_id", help="LLM JSONのjob_id (llm/{job_id}.json)")
args = parser.parse_args()
generate_preview(args.job_id)
Loading
Loading