Spaces:
Running
Running
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)}" | |
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) |