File size: 5,668 Bytes
09c17cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
"""
設定ファイル - パス設定専用(Tauriアプリ用)
"""

import os
import sys
from typing import Dict, Any
from path_manager import get_path_manager


class Config:
    """設定管理クラス(Tauriアプリ用)"""
    
    # 実行環境の判定
    @classmethod
    def _get_base_path(cls) -> str:
        """ベースパスを取得(pyinstaller対応)"""
        if getattr(sys, 'frozen', False):
            # pyinstallerでビルドされた場合
            return os.path.dirname(sys.executable)
        else:
            # 開発環境の場合
            return os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
    # MeCab設定(従来。必要なら使用)
    MECAB_CONFIG_PATH = "/opt/homebrew/etc/mecabrc"
    MECAB_DICT_PATH = "/opt/homebrew/lib/mecab/dic/ipadic"
    
    # AIモデル設定(Tauriアプリ用)
    # 環境変数で指定されていない場合は、ユーザーのDocumentsフォルダをデフォルトに
    DEFAULT_MODEL_PATH = os.path.expanduser("~/Documents/models/llama-3.2-3b-instruct-q4_k_m.gguf")
    
    # fugashi設定(MeCab/IPA 用)。Sudachi は SudachiPy を直接使用する。
    # sudachidict_core のパスは参照のみ(情報表示やデバッグ用途)。
    try:
        import importlib.util
        spec = importlib.util.find_spec("sudachidict_core")
        if spec and spec.origin:
            # origin は __init__.py のパス。辞書ディレクトリはその親
            import os as _os
            _pkg_dir = _os.path.dirname(spec.origin)
            SUDACHI_DICT_PATH = _pkg_dir
        else:
            SUDACHI_DICT_PATH = ""
    except Exception:
        SUDACHI_DICT_PATH = ""

    # fugashi は常に MeCab 設定を使用(IPA)。
    FUGASHI_ARGS = f"-r {MECAB_CONFIG_PATH}"
    
    @classmethod
    def get_mecab_config_path(cls) -> str:
        """MeCab設定ファイルのパスを取得"""
        return cls.MECAB_CONFIG_PATH
    
    @classmethod
    def get_mecab_dict_path(cls) -> str:
        """MeCab辞書のパスを取得"""
        return cls.MECAB_DICT_PATH
    
    @classmethod
    def get_fugashi_args(cls) -> str:
        """fugashi用の引数を取得"""
        return cls.FUGASHI_ARGS
    
    @classmethod
    def get_default_model_path(cls) -> str:
        """デフォルトのモデルパスを取得"""
        return get_path_manager().get_model_path()
    
    @classmethod
    def get_package_path(cls) -> str:
        """パッケージパスを取得"""
        return get_path_manager().get_package_path()
    
    @classmethod
    def validate_paths(cls) -> Dict[str, bool]:
        """パスの存在確認"""
        return {
            "mecab_config": os.path.exists(cls.MECAB_CONFIG_PATH),
            "mecab_dict": os.path.exists(cls.MECAB_DICT_PATH),
            "default_model": os.path.exists(cls.DEFAULT_MODEL_PATH)
        }
    
    @classmethod
    def print_status(cls):
        """設定状況を表示"""
        print("=== 設定状況 ===")
        print(f"MeCab設定ファイル: {cls.MECAB_CONFIG_PATH}")
        print(f"MeCab辞書: {cls.MECAB_DICT_PATH}")
        print(f"デフォルトモデル: {cls.DEFAULT_MODEL_PATH}")
        print(f"fugashi引数: {cls.FUGASHI_ARGS}")
        print(f"Sudachi辞書パス検出: {getattr(cls, 'SUDACHI_DICT_PATH', '')}")
        
        print("\n=== パス存在確認 ===")
        status = cls.validate_paths()
        for name, exists in status.items():
            status_text = "✓" if exists else "✗"
            print(f"{name}: {status_text}")


# 環境変数での上書き対応
def load_config_from_env():
    """環境変数から設定を読み込み"""
    Config.MECAB_CONFIG_PATH = os.getenv("MECAB_CONFIG_PATH", Config.MECAB_CONFIG_PATH)
    Config.MECAB_DICT_PATH = os.getenv("MECAB_DICT_PATH", Config.MECAB_DICT_PATH)
    Config.DEFAULT_MODEL_PATH = os.getenv("DEFAULT_MODEL_PATH", Config.DEFAULT_MODEL_PATH)
    # 環境変数 SUDACHI_DICT_PATH があれば記録のみ(SudachiPy が使用)。
    sudachi_env = os.getenv("SUDACHI_DICT_PATH", getattr(Config, "SUDACHI_DICT_PATH", ""))
    if sudachi_env:
        Config.SUDACHI_DICT_PATH = sudachi_env
    # fugashiは常にMeCab設定
    Config.FUGASHI_ARGS = f"-r {Config.MECAB_CONFIG_PATH}"


# 環境変数から設定を読み込み
load_config_from_env()


# テスト関数
def test_config():
    """設定のテスト"""
    print("=== Configテスト ===")
    
    # 設定状況を表示
    Config.print_status()
    
    # fugashiテスト
    try:
        import fugashi
        print(f"\n=== fugashiテスト ===")
        tagger = fugashi.GenericTagger(Config.get_fugashi_args())
        test_text = "こんにちは世界"
        tokens = tagger(test_text)
        print(f"テストテキスト: '{test_text}'")
        print(f"形態素: {[token.surface for token in tokens]}")
        print("✓ fugashi動作確認完了")
    except Exception as e:
        print(f"✗ fugashiテスト失敗: {e}")
    
    # AIクラステスト
    try:
        from ai import AI
        print(f"\n=== AIクラステスト ===")
        if os.path.exists(Config.get_default_model_path()):
            ai = AI(Config.get_default_model_path())
            tokens = ai.get_token_probabilities("こんにちは", k=3)
            print(f"テスト結果: {tokens}")
            print("✓ AIクラス動作確認完了")
        else:
            print("✗ デフォルトモデルが見つかりません")
    except Exception as e:
        print(f"✗ AIクラステスト失敗: {e}")


if __name__ == "__main__":
    test_config()