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