File size: 2,575 Bytes
227e75d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from typing import Optional
import openai
from pathlib import Path

class LLMService:
    def __init__(self, api_key: str):
        """
        LLMサービスの初期化
        Args:
            api_key: OpenAI APIキー
        """
        self.api_key = api_key
        openai.api_key = api_key
        
    def create_prompt(self, content: str, query: str) -> str:
        """
        プロンプトを生成
        Args:
            content: コードの内容
            query: ユーザーからの質問
        Returns:
            生成されたプロンプト
        """
        return f"""以下はGitHubリポジトリのコード解析結果です。このコードについて質問に答えてください。

コード解析結果:
{content}

質問: {query}

できるだけ具体的に、コードの内容を参照しながら回答してください。"""

    def get_response(self, content: str, query: str) -> tuple[str, Optional[str]]:
        """
        LLMを使用して回答を生成
        Args:
            content: コードの内容
            query: ユーザーからの質問
        Returns:
            (回答, エラーメッセージ)のタプル
        """
        try:
            prompt = self.create_prompt(content, query)
            
            response = openai.ChatCompletion.create(
                model="gpt-3.5-turbo-16k",
                messages=[
                    {
                        "role": "system",
                        "content": "あなたはコードアナリストとして、リポジトリの解析と質問への回答を行います。"
                    },
                    {
                        "role": "user",
                        "content": prompt
                    }
                ]
            )
            
            return response.choices[0].message.content, None
            
        except Exception as e:
            return None, f"エラーが発生しました: {str(e)}"

    @staticmethod
    def format_code_content(files_content: dict) -> str:
        """
        ファイル内容をプロンプト用にフォーマット
        Args:
            files_content: ファイルパスと内容の辞書
        Returns:
            フォーマットされたテキスト
        """
        formatted_content = []
        for file_path, content in files_content.items():
            formatted_content.append(
                f"#ファイルパス\n{file_path}\n------------\n{content}\n"
            )
        return "\n".join(formatted_content)