repository_reader / services /llm_service.py
DeL-TaiseiOzaki
first commit
227e75d
raw
history blame
2.58 kB
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)