Repository: kizuna-org/akari-poc
Pull request #48: feat(akari): Implement an original logger
Author: login: 5ouma
Created: 2025-04-23T05:38:08Z | Merged: 2025-04-24T14:31:39Z



<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **新機能**
  - モジュール全体にロギング機能を導入し、各モジュールで詳細なデバッグログを記録できるようになりました。

- **リファクタリング**
  - 既存のprint文をロガーによるログ出力に置き換え、ロギングの一元管理を実現しました。
  - 各モジュールおよびルーターの初期化時にロガーインスタンスを受け取るように変更されました。

- **テスト**
  - テストコードにロガー用のフィクスチャを追加し、モジュールの新しい初期化方式に対応しました。
<!-- end of auto-generated comment: release notes by coderabbit.ai -->


Diff:
diff --git a/akari/__init__.py b/akari/__init__.py
index d81e63d..a8dc03e 100644
--- a/akari/__init__.py
+++ b/akari/__init__.py
@@ -1,4 +1,5 @@
 from .data import AkariData, AkariDataSet, AkariDataSetType
+from .logger import AkariLogger
 from .module import AkariModule, AkariModuleParams, AkariModuleType
 from .router import MainRouter
 
@@ -10,4 +11,5 @@
     "AkariModuleParams",
     "AkariModuleType",
     "MainRouter",
+    "AkariLogger",
 ]
diff --git a/akari/logger.py b/akari/logger.py
new file mode 100644
index 0000000..4723404
--- /dev/null
+++ b/akari/logger.py
@@ -0,0 +1,3 @@
+import logging
+
+AkariLogger = logging.Logger
diff --git a/akari/module.py b/akari/module.py
index 8346e01..1f374fd 100644
--- a/akari/module.py
+++ b/akari/module.py
@@ -4,6 +4,7 @@
 from typing import TYPE_CHECKING, Any
 
 import akari.data as data
+import akari.logger as logger
 
 if TYPE_CHECKING:
     import akari.router as router
@@ -13,8 +14,9 @@
 
 
 class AkariModule(ABC):
-    def __init__(self, router: router.MainRouter) -> None:
+    def __init__(self, router: router.MainRouter, logger: logger.AkariLogger) -> None:
         self._router = router
+        self._logger = logger
 
     @abstractmethod
     def call(self, data: data.AkariData, params: AkariModuleParams) -> data.AkariDataSet:
diff --git a/akari/router.py b/akari/router.py
index c521ebe..15f47ca 100644
--- a/akari/router.py
+++ b/akari/router.py
@@ -2,12 +2,14 @@
 from typing import Dict
 
 import akari.data as data
+import akari.logger as logger
 import akari.module as module
 
 
 class MainRouter:
-    def __init__(self) -> None:
+    def __init__(self, logger: logger.AkariLogger) -> None:
         self._modules: Dict[module.AkariModuleType, module.AkariModule] | None = None
+        self._logger = logger
 
     def setModules(self, modules: Dict[module.AkariModuleType, module.AkariModule]) -> None:
         self._modules = modules
@@ -24,9 +26,7 @@ def callModule(
         if selected_module is None:
             raise ValueError(f"Module {moduleType} not found in router.")
 
-        print()
-        print("[Router] Module calling:", selected_module.__class__.__name__)
-        print()
+        self._logger.debug("Calling module:", selected_module.__class__.__name__)
 
         dataset = selected_module.call(inputData, params)
 
diff --git a/main.py b/main.py
index c38e422..3c964d5 100644
--- a/main.py
+++ b/main.py
@@ -11,7 +11,11 @@
 
 dotenv.load_dotenv()
 
-print("Hello, Akari!")
+
+akariLogger = akari.AkariLogger("Akari")
+
+akariLogger.info("Hello, Akari!")
+
 
 token_provider = get_bearer_token_provider(
     DefaultAzureCredential(exclude_managed_identity_credential=True), "https://cognitiveservices.azure.com/.default"
@@ -24,14 +28,14 @@
 )
 
 
-akariRouter = akari.MainRouter()
+akariRouter = akari.MainRouter(logger=akariLogger)
 akariRouter.setModules(
     {
-        modules.RootModule: modules.RootModule(akariRouter),
-        sample.SampleModule: sample.SampleModule(akariRouter),
-        openai.LLMModule: openai.LLMModule(akariRouter, client),
-        openai.STTModule: openai.STTModule(akariRouter, client),
-        openai.TTSModule: openai.TTSModule(akariRouter, client),
+        modules.RootModule: modules.RootModule(akariRouter, akariLogger),
+        sample.SampleModule: sample.SampleModule(akariRouter, akariLogger),
+        openai.LLMModule: openai.LLMModule(akariRouter, akariLogger, client),
+        openai.STTModule: openai.STTModule(akariRouter, akariLogger, client),
+        openai.TTSModule: openai.TTSModule(akariRouter, akariLogger, client),
     }
 )
 
diff --git a/modules/openai/llm.py b/modules/openai/llm.py
index 862f57e..7728149 100644
--- a/modules/openai/llm.py
+++ b/modules/openai/llm.py
@@ -4,7 +4,14 @@
 from openai import AzureOpenAI
 from openai.types.chat import ChatCompletion, ChatCompletionMessageParam
 
-from akari import AkariData, AkariDataSet, AkariDataSetType, AkariModule, MainRouter
+from akari import (
+    AkariData,
+    AkariDataSet,
+    AkariDataSetType,
+    AkariLogger,
+    AkariModule,
+    MainRouter,
+)
 
 
 @dataclasses.dataclass
@@ -20,14 +27,14 @@ class LLMModuleParams:
 
 
 class LLMModule(AkariModule):
-    def __init__(self, router: MainRouter, client: AzureOpenAI) -> None:
-        super().__init__(router)
+    def __init__(self, router: MainRouter, logger: AkariLogger, client: AzureOpenAI) -> None:
+        super().__init__(router, logger)
         self.client = client
 
     def call(self, data: AkariData, params: LLMModuleParams) -> AkariDataSet:
-        print("LLMModule called")
-        print("Data:", data)
-        print("Params:", params)
+        self._logger.debug("LLMModule called")
+        self._logger.debug("Data:", data)
+        self._logger.debug("Params:", params)
 
         response = self.client.chat.completions.create(
             model=params.model,
@@ -44,12 +51,12 @@ def call(self, data: AkariData, params: LLMModuleParams) -> AkariDataSet:
         if params.stream:
             for chunk in response:
                 if isinstance(chunk, ChatCompletion) and hasattr(chunk, "choices") and chunk.choices:
-                    print(chunk.choices[0].delta.content, end="", flush=True)
+                    pass
                 else:
                     raise TypeError("Chunk does not have 'choices' attribute or is improperly formatted.")
         else:
             if isinstance(response, ChatCompletion):
-                print(response.choices[0].message.content)
+                self._logger.debug(response.choices[0].message.content)
                 if response.choices[0].message.content:
                     text_main = response.choices[0].message.content
             else:
diff --git a/modules/openai/stt.py b/modules/openai/stt.py
index b3018fd..bdcc81f 100644
--- a/modules/openai/stt.py
+++ b/modules/openai/stt.py
@@ -3,7 +3,14 @@
 
 from openai import AzureOpenAI
 
-from akari import AkariData, AkariDataSet, AkariDataSetType, AkariModule, MainRouter
+from akari import (
+    AkariData,
+    AkariDataSet,
+    AkariDataSetType,
+    AkariLogger,
+    AkariModule,
+    MainRouter,
+)
 
 
 @dataclasses.dataclass
@@ -15,14 +22,14 @@ class STTModuleParams:
 
 
 class STTModule(AkariModule):
-    def __init__(self, router: MainRouter, client: AzureOpenAI) -> None:
-        super().__init__(router)
+    def __init__(self, router: MainRouter, logger: AkariLogger, client: AzureOpenAI) -> None:
+        super().__init__(router, logger)
         self.client = client
 
     def call(self, data: AkariData, params: STTModuleParams) -> AkariDataSet:
-        print("STTModule called")
-        print("Data:", data)
-        print("Params:", params)
+        self._logger.debug("STTModule called")
+        self._logger.debug("Data:", data)
+        self._logger.debug("Params:", params)
 
         audio = data.last().audio
         if audio is None:
diff --git a/modules/openai/tts.py b/modules/openai/tts.py
index 2adee50..b995ae9 100644
--- a/modules/openai/tts.py
+++ b/modules/openai/tts.py
@@ -3,7 +3,14 @@
 from openai import AzureOpenAI
 from typing_extensions import Literal
 
-from akari import AkariData, AkariDataSet, AkariDataSetType, AkariModule, MainRouter
+from akari import (
+    AkariData,
+    AkariDataSet,
+    AkariDataSetType,
+    AkariLogger,
+    AkariModule,
+    MainRouter,
+)
 
 
 @dataclasses.dataclass
@@ -17,14 +24,14 @@ class TTSModuleParams:
 
 
 class TTSModule(AkariModule):
-    def __init__(self, router: MainRouter, client: AzureOpenAI) -> None:
-        super().__init__(router)
+    def __init__(self, router: MainRouter, logger: AkariLogger, client: AzureOpenAI) -> None:
+        super().__init__(router, logger)
         self.client = client
 
     def call(self, data: AkariData, params: TTSModuleParams) -> AkariDataSet:
-        print("TTSModule called")
-        print("Data:", data)
-        print("Params:", params)
+        self._logger.debug("TTSModule called")
+        self._logger.debug("Data:", data)
+        self._logger.debug("Params:", params)
 
         response = self.client.audio.speech.create(
             model=params.model,
diff --git a/modules/root.py b/modules/root.py
index ce0c86f..a086dc0 100644
--- a/modules/root.py
+++ b/modules/root.py
@@ -1,14 +1,21 @@
-from akari import AkariData, AkariDataSet, AkariModule, AkariModuleParams, MainRouter
+from akari import (
+    AkariData,
+    AkariDataSet,
+    AkariLogger,
+    AkariModule,
+    AkariModuleParams,
+    MainRouter,
+)
 
 
 class RootModule(AkariModule):
-    def __init__(self, router: MainRouter) -> None:
-        super().__init__(router)
+    def __init__(self, router: MainRouter, logger: AkariLogger) -> None:
+        super().__init__(router, logger)
 
     def call(self, data: AkariData, params: AkariModuleParams) -> AkariDataSet:
-        print("RootModule called")
-        print("Data:", data)
-        print("Params:", params)
+        self._logger.debug("RootModule called")
+        self._logger.debug("Data:", data)
+        self._logger.debug("Params:", params)
         self._router.callModule(params, data, None)
 
         return AkariDataSet()
diff --git a/sample/module.py b/sample/module.py
index 56c5565..c74c366 100644
--- a/sample/module.py
+++ b/sample/module.py
@@ -1,12 +1,19 @@
-from akari import AkariData, AkariDataSet, AkariModule, AkariModuleParams, MainRouter
+from akari import (
+    AkariData,
+    AkariDataSet,
+    AkariLogger,
+    AkariModule,
+    AkariModuleParams,
+    MainRouter,
+)
 
 
 class SampleModule(AkariModule):
-    def __init__(self, router: MainRouter) -> None:
-        super().__init__(router)
+    def __init__(self, router: MainRouter, logger: AkariLogger) -> None:
+        super().__init__(router, logger)
 
     def call(self, data: AkariData, params: AkariModuleParams) -> AkariDataSet:
-        print("SampleModule called")
-        print("Data:", data)
-        print("Params:", params)
+        self._logger.debug("SampleModule called")
+        self._logger.debug("Data:", data)
+        self._logger.debug("Params:", params)
         return AkariDataSet()
diff --git a/tests/test_sample_module.py b/tests/test_sample_module.py
index 9d1c963..9541a14 100644
--- a/tests/test_sample_module.py
+++ b/tests/test_sample_module.py
@@ -1,17 +1,22 @@
 import pytest
 
-from akari import AkariData, AkariDataSet, MainRouter
+from akari import AkariData, AkariDataSet, AkariLogger, MainRouter
 from sample.module import SampleModule
 
 
 @pytest.fixture
-def main_router() -> MainRouter:
-    return MainRouter()
+def main_router(logger: AkariLogger) -> MainRouter:
+    return MainRouter(logger=logger)
 
 
 @pytest.fixture
-def sample_module(main_router: MainRouter) -> SampleModule:
-    return SampleModule(main_router)
+def logger() -> AkariLogger:
+    return AkariLogger("test")
+
+
+@pytest.fixture
+def sample_module(main_router: MainRouter, logger: AkariLogger) -> SampleModule:
+    return SampleModule(main_router, logger)
 
 
 def test_sample_module_call(sample_module: SampleModule) -> None:


Reviews:
user: login: copilot-pull-request-reviewer[bot]
body: ## Pull Request Overview

This pull request implements an original logger into the Akari framework to replace print statements with debug logging and improve consistency in logging across modules.
- Updated imports to include AkariLogger where needed.
- Modified module and fixture constructors to accept a logger argument.
- Replaced print statements with logger.debug calls.

### Reviewed Changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 2 comments.

<details>
<summary>Show a summary per file</summary>

| File                            | Description                                                          |
| ------------------------------- | -------------------------------------------------------------------- |
| tests/test_sample_module.py     | Updated fixture signatures and imports to inject a logger.           |
| sample/module.py                | Updated SampleModule to accept a logger and use debug logging.         |
| modules/root.py                | Updated RootModule constructor and logging calls accordingly.        |
| modules/openai/tts.py           | Adapted TTSModule for logger injection and replaced prints.          |
| modules/openai/stt.py           | Adapted STTModule for logger injection and replaced prints.          |
| modules/openai/llm.py           | Modified LLMModule to use logger debugging; streaming branch changed.  |
| main.py                         | Updated module instantiation to pass the logger instead of printing.   |
| akari/router.py                 | Replaced print output with logger.debug in module calling.           |
| akari/module.py                 | Updated AkariModule to require a logger for consistent logging.        |
| akari/logger.py                 | Introduced AkariLogger aliasing Python’s logging.Logger.             |
| akari/__init__.py               | Updated module exports to include AkariLogger.                       |
</details>





state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T05:38:54Z
user: login: coderabbitai[bot]
body: **Actionable comments posted: 2**

<details>
<summary>🧹 Nitpick comments (1)</summary><blockquote>

<details>
<summary>akari/logger.py (1)</summary><blockquote>

`1-3`: **型エイリアスの導入は適切ですが、さらに改善の余地があります**

ロギング機能の導入は素晴らしいですが、いくつか改善できる点があります：

1. ドキュメンテーション文字列（docstring）を追加して、この型エイリアスの目的と使用方法を説明すると良いでしょう。
2. 単純な型エイリアスではなく、カスタムロガークラスの作成やファクトリ関数の提供を検討してみてはいかがでしょうか？



```diff
 import logging
+
+"""AkariLoggerは標準のPython loggingモジュールのLoggerクラスのエイリアスです。
+Akariアプリケーション全体で一貫したロギングを提供します。
+"""
 
 AkariLogger = logging.Logger
+
+def create_logger(name: str) -> AkariLogger:
+    """指定された名前で構成済みのAkariLoggerインスタンスを作成します。
+    
+    Args:
+        name: ロガーの名前（通常は__name__）
+        
+    Returns:
+        設定済みのAkariLoggerインスタンス
+    """
+    logger = logging.getLogger(name)
+    return logger
```

</blockquote></details>

</blockquote></details>

<details>
<summary>📜 Review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 84f1f6b513e1ab6dd9e5d122922a0e994987a71b and 56701d5c507f1404d6ba686977cfec1401fb1313.

</details>

<details>
<summary>📒 Files selected for processing (11)</summary>

* `akari/__init__.py` (2 hunks)
* `akari/logger.py` (1 hunks)
* `akari/module.py` (2 hunks)
* `akari/router.py` (2 hunks)
* `main.py` (2 hunks)
* `modules/openai/llm.py` (3 hunks)
* `modules/openai/stt.py` (2 hunks)
* `modules/openai/tts.py` (2 hunks)
* `modules/root.py` (1 hunks)
* `sample/module.py` (1 hunks)
* `tests/test_sample_module.py` (2 hunks)

</details>

<details>
<summary>🧰 Additional context used</summary>

<details>
<summary>🧬 Code Graph Analysis (8)</summary>

<details>
<summary>akari/__init__.py (1)</summary><blockquote>

<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>

</blockquote></details>
<details>
<summary>akari/router.py (1)</summary><blockquote>

<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>

</blockquote></details>
<details>
<summary>sample/module.py (5)</summary><blockquote>

<details>
<summary>akari/data.py (2)</summary>

* `AkariData` (19-40)
* `AkariDataSet` (12-16)

</details>
<details>
<summary>akari/module.py (2)</summary>

* `AkariModule` (16-23)
* `call` (22-23)

</details>
<details>
<summary>akari/router.py (1)</summary>

* `MainRouter` (9-35)

</details>
<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>
<details>
<summary>modules/root.py (1)</summary>

* `call` (15-21)

</details>

</blockquote></details>
<details>
<summary>akari/module.py (2)</summary><blockquote>

<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>
<details>
<summary>akari/router.py (1)</summary>

* `MainRouter` (9-35)

</details>

</blockquote></details>
<details>
<summary>modules/root.py (4)</summary><blockquote>

<details>
<summary>akari/module.py (2)</summary>

* `AkariModule` (16-23)
* `call` (22-23)

</details>
<details>
<summary>akari/router.py (1)</summary>

* `MainRouter` (9-35)

</details>
<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>
<details>
<summary>sample/module.py (1)</summary>

* `call` (15-19)

</details>

</blockquote></details>
<details>
<summary>modules/openai/tts.py (6)</summary><blockquote>

<details>
<summary>akari/data.py (3)</summary>

* `AkariData` (19-40)
* `AkariDataSet` (12-16)
* `AkariDataSetType` (6-9)

</details>
<details>
<summary>akari/module.py (2)</summary>

* `AkariModule` (16-23)
* `call` (22-23)

</details>
<details>
<summary>akari/router.py (1)</summary>

* `MainRouter` (9-35)

</details>
<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>
<details>
<summary>modules/openai/stt.py (1)</summary>

* `call` (29-54)

</details>
<details>
<summary>modules/openai/llm.py (1)</summary>

* `call` (34-68)

</details>

</blockquote></details>
<details>
<summary>modules/openai/llm.py (7)</summary><blockquote>

<details>
<summary>akari/data.py (3)</summary>

* `AkariData` (19-40)
* `AkariDataSet` (12-16)
* `AkariDataSetType` (6-9)

</details>
<details>
<summary>akari/module.py (2)</summary>

* `AkariModule` (16-23)
* `call` (22-23)

</details>
<details>
<summary>akari/router.py (1)</summary>

* `MainRouter` (9-35)

</details>
<details>
<summary>tests/test_sample_module.py (1)</summary>

* `logger` (13-14)

</details>
<details>
<summary>modules/openai/stt.py (1)</summary>

* `call` (29-54)

</details>
<details>
<summary>sample/module.py (1)</summary>

* `call` (15-19)

</details>
<details>
<summary>modules/openai/tts.py (1)</summary>

* `call` (31-48)

</details>

</blockquote></details>
<details>
<summary>main.py (5)</summary><blockquote>

<details>
<summary>modules/root.py (1)</summary>

* `RootModule` (11-21)

</details>
<details>
<summary>sample/module.py (1)</summary>

* `SampleModule` (11-19)

</details>
<details>
<summary>modules/openai/llm.py (1)</summary>

* `LLMModule` (29-68)

</details>
<details>
<summary>modules/openai/stt.py (1)</summary>

* `STTModule` (24-54)

</details>
<details>
<summary>modules/openai/tts.py (1)</summary>

* `TTSModule` (26-48)

</details>

</blockquote></details>

</details>

</details>

<details>
<summary>🔇 Additional comments (24)</summary><blockquote>

<details>
<summary>akari/__init__.py (1)</summary>

`2-2`: **変更は適切です**

`AkariLogger`のインポートと`__all__`リストへの追加は適切に行われています。これにより、新しいロガー型が公開APIの一部として正しく公開されます。




Also applies to: 14-14

</details>
<details>
<summary>akari/module.py (1)</summary>

`7-7`: **ロガーの依存性注入の実装は適切です**

`AkariModule`クラスへのロガーパラメータの追加とそのプロパティへの保存は、適切に実装されています。この変更により、以下のような利点があります：

1. すべてのモジュールサブクラスで一貫したロギング機能が利用可能になります
2. 依存性注入パターンに従っており、テスト容易性が向上します
3. モジュール間でロギング設定を共有できます




Also applies to: 17-19

</details>
<details>
<summary>modules/root.py (3)</summary>

`1-8`: **AkariLoggerのインポートが適切に追加されました！**

ロギング機能の実装に必要な`AkariLogger`をインポートリストに追加し、グループ化されたインポート形式を維持しています。これはプロジェクト全体のロギング戦略の実装として適切です。

---

`12-13`: **コンストラクタへのloggerパラメータの追加が適切に実装されています**

基底クラス`AkariModule`の変更に合わせて、`RootModule`のコンストラクタが`logger`パラメータを受け取り、それを親クラスのコンストラクタに正しく渡しています。型アノテーションも適切です。

---

`16-18`: **printステートメントがloggerに適切に置き換えられています**

デバッグメッセージを出力するための`print`文が、より構造化された`self._logger.debug`メソッド呼び出しに置き換えられています。これにより、ログレベルの制御やフォーマットの一貫性が確保されます。

</details>
<details>
<summary>sample/module.py (3)</summary>

`1-8`: **AkariLoggerのインポートが適切に追加されています**

ロギング機能実装のための`AkariLogger`が適切にインポートリストに追加されています。これはプロジェクト全体のロギング戦略の一環として適切です。

---

`12-13`: **loggerパラメータの追加が適切に実装されています**

基底クラス`AkariModule`の変更に合わせて、`SampleModule`のコンストラクタが`logger`パラメータを受け取り、それを親クラスのコンストラクタに正しく渡しています。型アノテーションも適切です。

---

`16-18`: **printステートメントがloggerに適切に置き換えられています**

デバッグメッセージを出力するための`print`文が、より構造化された`self._logger.debug`メソッド呼び出しに置き換えられています。これにより、ログレベルの制御やフォーマットの一貫性が確保されます。

</details>
<details>
<summary>tests/test_sample_module.py (3)</summary>

`3-3`: **AkariLoggerのインポートが適切に追加されています**

テストファイルに`AkariLogger`が適切にインポートされており、テスト実行時にロガーを利用できるようになっています。

---

`13-15`: **loggerフィクスチャの追加は適切です**

`AkariLogger`のインスタンスを返す`logger`フィクスチャが追加されています。"test"という名前でロガーを初期化しており、テスト環境に適したセットアップになっています。

---

`17-19`: **sample_moduleフィクスチャの更新は適切です**

`SampleModule`のコンストラクタが更新されたことに対応して、`sample_module`フィクスチャも更新され、`logger`パラメータを受け取って`SampleModule`コンストラクタに渡すようになっています。これによりテストが新しいインターフェースで正しく動作します。

</details>
<details>
<summary>modules/openai/stt.py (3)</summary>

`6-13`: **AkariLoggerのインポートが適切に追加されています**

ロギング機能実装のための`AkariLogger`が適切にインポートリストに追加されています。グループ化されたインポート形式を維持しており、プロジェクト全体のコーディングスタイルと一貫しています。

---

`25-26`: **loggerパラメータの追加が適切に実装されています**

基底クラス`AkariModule`の変更に合わせて、`STTModule`のコンストラクタが`logger`パラメータを受け取り、それを親クラスのコンストラクタに正しく渡しています。既存の`client`パラメータも保持されており、後方互換性を維持しています。

---

`30-32`: **printステートメントがloggerに適切に置き換えられています**

デバッグメッセージを出力するための`print`文が、より構造化された`self._logger.debug`メソッド呼び出しに置き換えられています。これにより、ログレベルの制御やフォーマットの一貫性が確保されます。他のモジュールと同じロギングパターンを使用しており、一貫性のある実装になっています。

</details>
<details>
<summary>modules/openai/tts.py (3)</summary>

`6-13`: **AkariLoggerをインポートリストに追加したのは適切です**

モジュール全体でロガーを使用するために必要なインポートが追加されています。Akariの様々なクラスを明示的にインポートする方法は、コードの読みやすさと依存関係の明確化に貢献しています。

---

`27-28`: **コンストラクタのシグネチャ変更は基底クラスの変更と一致しています**

AkariModule基底クラスの新しいコンストラクタシグネチャに合わせて、loggerパラメータが追加されています。また、super()を呼び出して親クラスにloggerを適切に渡している点も良いです。

---

`32-34`: **printからロガーへの移行は一貫性があります**

以前のprint文がself._logger.debugへ置き換えられており、他のモジュール（LLMModuleやSTTModuleなど）と同様のスタイルでロギングが実装されています。この変更により、ログ出力の一貫性と管理が向上しています。

</details>
<details>
<summary>modules/openai/llm.py (5)</summary>

`7-14`: **インポートリストへのAkariLoggerの追加は適切です**

ロギング機能を実装するために必要なインポートが追加されています。Akariの様々なクラスをまとめてインポートする方法はコードの一貫性を保っています。

---

`30-31`: **コンストラクタのシグネチャ変更は基底クラスと一致しています**

AkariModule基底クラスの変更に合わせて、loggerパラメータが追加されています。super()への適切なパラメータ渡しも実装されています。

---

`35-37`: **デバッグログの実装は一貫性があります**

print文からロガーのdebugメソッドへの移行が適切に行われています。モジュール名、データ、パラメータのログ出力は他のモジュールと同様のパターンで実装されており、一貫性があります。

---

`54-54`: **ストリーミングレスポンスの処理が改善されています**

以前のコードでprint文を使用していた部分が、単にpassするように変更されています。これにより、不要なログ出力が削減され、コードがクリーンになっています。

---

`59-59`: **レスポンス内容のログ出力が適切に変更されています**

ChatCompletionレスポンスのcontent出力がprint文から_logger.debugに置き換えられています。これによりログレベルの制御が可能になり、ログ出力の一貫性が向上しています。

</details>
<details>
<summary>main.py (2)</summary>

`15-17`: **ロガーの初期化が適切に実装されています**

akari.AkariLoggerを使用して「Akari」という名前でロガーが初期化され、情報メッセージが出力されています。これはアプリケーション起動時のログ出力として適切です。

---

`34-38`: **全モジュールへのロガー注入が一貫して実装されています**

全てのモジュール（RootModule、SampleModule、OpenAIの各モジュール）のコンストラクタ呼び出しにakariLoggerが追加されています。これにより、アプリケーション全体で一貫したロギング機構が確立されています。

</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T05:40:45Z
user: login: coderabbitai[bot]
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T14:30:59Z
user: login: shiron-dev
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T14:31:25Z
user: login: shiron-dev
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T14:31:27Z

Review comments:
diff_hunk: @@ -44,12 +51,12 @@ def call(self, data: AkariData, params: LLMModuleParams) -> AkariDataSet:
         if params.stream:
             for chunk in response:
                 if isinstance(chunk, ChatCompletion) and hasattr(chunk, "choices") and chunk.choices:
-                    print(chunk.choices[0].delta.content, end="", flush=True)
+                    pass
path: modules/openai/llm.py
user: login: Copilot
body: In streaming mode, replacing the print statement with 'pass' results in no output or logging for chunk data. Consider either reintroducing a logging statement or processing the chunk appropriately.
```suggestion
                    self._logger.debug(chunk.choices[0].message.content)
                    if chunk.choices[0].message.content:
                        text_main += chunk.choices[0].message.content
```
created_at: 2025-04-23T05:38:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -24,9 +25,8 @@ def callModule(
         if selected_module is None:
             raise ValueError(f"Module {moduleType} not found in router.")
 
-        print()
-        print("[Router] Module calling:", selected_module.__class__.__name__)
-        print()
+        akariLogger = logger.AkariLogger(__name__)
+        akariLogger.debug("Calling module:", selected_module.__class__.__name__)
 
path: akari/router.py
user: login: Copilot
body: Instantiating a new logger inside callModule diverges from the dependency injection approach used elsewhere. Consider injecting a logger into the router to ensure consistency in logging configuration.
```suggestion
        self._logger.debug("Calling module:", selected_module.__class__.__name__)
```
created_at: 2025-04-23T05:38:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -24,9 +25,8 @@ def callModule(
         if selected_module is None:
             raise ValueError(f"Module {moduleType} not found in router.")
 
-        print()
-        print("[Router] Module calling:", selected_module.__class__.__name__)
-        print()
+        akariLogger = logger.AkariLogger(__name__)
+        akariLogger.debug("Calling module:", selected_module.__class__.__name__)
path: akari/router.py
user: login: coderabbitai[bot]
body: _🛠️ Refactor suggestion_

**ロガーインスタンスの作成位置とデバッグメソッドの使用方法を改善できます**

現在の実装では、`callModule`メソッドが呼ばれるたびに新しいロガーインスタンスが作成されています。これは効率的ではありません。また、`debug`メソッドの使い方も標準的なPythonロギングの慣行と異なります。



以下の改善を推奨します：

1. ロガーインスタンスをコンストラクタで一度だけ作成する
2. `debug`メソッドの使い方を修正する（フォーマット文字列とパラメータを使用）

```diff
 class MainRouter:
     def __init__(self) -> None:
         self._modules: Dict[module.AkariModuleType, module.AkariModule] | None = None
+        self._logger = logger.AkariLogger(__name__)
 
     def setModules(self, modules: Dict[module.AkariModuleType, module.AkariModule]) -> None:
         self._modules = modules
 
     def callModule(
         self, moduleType: module.AkariModuleType, data: data.AkariData, params: module.AkariModuleParams
     ) -> data.AkariData:
         if self._modules is None:
             raise ValueError("Modules not set in router.")
 
         inputData = copy.deepcopy(data)
 
         selected_module = self._modules[moduleType]
         if selected_module is None:
             raise ValueError(f"Module {moduleType} not found in router.")
 
-        akariLogger = logger.AkariLogger(__name__)
-        akariLogger.debug("Calling module:", selected_module.__class__.__name__)
+        self._logger.debug("Calling module: %s", selected_module.__class__.__name__)
 
         dataset = selected_module.call(inputData, params)
```

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-23T05:40:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,14 +1,21 @@
-from akari import AkariData, AkariDataSet, AkariModule, AkariModuleParams, MainRouter
+from akari import (
+    AkariData,
+    AkariDataSet,
+    AkariLogger,
+    AkariModule,
+    AkariModuleParams,
+    MainRouter,
+)
 
 
 class RootModule(AkariModule):
-    def __init__(self, router: MainRouter) -> None:
-        super().__init__(router)
+    def __init__(self, router: MainRouter, logger: AkariLogger) -> None:
+        super().__init__(router, logger)
 
     def call(self, data: AkariData, params: AkariModuleParams) -> AkariDataSet:
-        print("RootModule called")
-        print("Data:", data)
-        print("Params:", params)
+        self._logger.debug("RootModule called")
+        self._logger.debug("Data:", data)
+        self._logger.debug("Params:", params)
         self._router.callModule(params, data, None)
path: modules/root.py
user: login: coderabbitai[bot]
body: _⚠️ Potential issue_

**callModuleメソッドの引数順序に問題があります**

`callModule`メソッドの引数順序が正しくないようです。`akari/router.py`の実装によると、引数の順序は`moduleType`、`data`、`params`のはずですが、現在は`params`、`data`、`None`となっています。

```diff
-        self._router.callModule(params, data, None)
+        self._router.callModule(moduleType, data, params)
```

このままでは実行時エラーが発生する可能性があります。



> Committable suggestion skipped: line range outside the PR's diff.

<!-- This is an auto-generated comment by CodeRabbit -->
created_at: 2025-04-23T05:40:44Z
author_association: CONTRIBUTOR

PR comments:
user: login: linear[bot]
created_at: 2025-04-23T05:38:11Z
body: <p><a href="https://linear.app/kizuna-org/issue/AKARI-17/change-print-to-use-logger">AKARI-17 Change print to use logger</a></p>
author_association: NONE
user: login: coderabbitai[bot]
created_at: 2025-04-23T05:40:41Z
body: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- walkthrough_start -->

## Walkthrough

この変更では、Akariプロジェクト全体にロギング機能が導入されました。`AkariLogger` という型エイリアスが新たに追加され、各モジュールやルーター、テストにおいて `print` 文の代わりにこのロガーを使ったデバッグログ出力に置き換えられています。`AkariModule` および各派生モジュールのコンストラクタは `logger` パラメータを受け取るように変更され、`main.py` でロガーインスタンスが生成され各モジュールに渡されます。テストコードもこの新しいロギング機構に対応するよう修正されています。

## Changes

| ファイル/グループ                                                                 | 変更内容概要                                                                                                         |
|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------|
| akari/__init__.py, akari/logger.py                                              | `AkariLogger` 型エイリアスを新設し、パブリックAPIとして公開。                                                      |
| akari/module.py, modules/root.py, sample/module.py,<br>modules/openai/llm.py, modules/openai/stt.py,<br>modules/openai/tts.py | 各モジュールのコンストラクタに `logger: AkariLogger` 引数を追加し、スーパークラスにも伝播。`print` を `_logger.debug` に置換。|
| akari/router.py                                                                 | 直接の `print` を廃止し、`AkariLogger` を利用したデバッグログ出力に変更。                                            |
| main.py                                                                         | `AkariLogger` インスタンスを生成し、各モジュール生成時に渡すよう修正。`print` をロガーの `info` に置換。            |
| tests/test_sample_module.py                                                      | `AkariLogger` のpytestフィクスチャを追加し、`SampleModule` 生成時に渡すようテストコードを修正。                     |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Main as main.py
    participant Logger as AkariLogger
    participant Router as MainRouter
    participant Module as AkariModule/各派生Module

    Main->>Logger: AkariLoggerインスタンス生成
    Main->>Router: MainRouterインスタンス生成
    Main->>Module: Module(router, logger, ...)
    Module->>Logger: _logger.debug("呼び出し情報やデータをログ出力")
    Router->>Logger: debugログでモジュール呼び出しを記録
```

```mermaid
sequenceDiagram
    participant Test as pytest
    participant Logger as AkariLogger("test")
    participant SampleModule as SampleModule

    Test->>Logger: AkariLogger("test")フィクスチャ生成
    Test->>SampleModule: SampleModule(main_router, logger)
    SampleModule->>Logger: _logger.debug("テスト用ログ出力")
```

<!-- walkthrough_end -->


---

<details>
<summary>📜 Recent review details</summary>

**Configuration used: CodeRabbit UI**
**Review profile: CHILL**
**Plan: Pro**

<details>
<summary>📥 Commits</summary>

Reviewing files that changed from the base of the PR and between 56701d5c507f1404d6ba686977cfec1401fb1313 and f18a9542f7ddf305b11d4c4df79f41f2820d0fbd.

</details>

<details>
<summary>📒 Files selected for processing (3)</summary>

* `akari/router.py` (2 hunks)
* `main.py` (2 hunks)
* `tests/test_sample_module.py` (1 hunks)

</details>

<details>
<summary>🚧 Files skipped from review as they are similar to previous changes (3)</summary>

* akari/router.py
* main.py
* tests/test_sample_module.py

</details>

</details>
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details>
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=kizuna-org/akari-poc&utm_content=48):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->
author_association: CONTRIBUTOR