parent
84f4eaeec9
commit
d2e3b7503b
@ -0,0 +1,48 @@
|
||||
import random
|
||||
import re
|
||||
from typing import Optional
|
||||
|
||||
import openai
|
||||
|
||||
from edmond.plugin import Plugin
|
||||
from edmond.utils import limit_text_length
|
||||
|
||||
|
||||
class Gpt3Plugin(Plugin):
|
||||
|
||||
REQUIRED_CONFIGS = ["openai_key", "computing_replies", "join_lines"]
|
||||
|
||||
def __init__(self, bot):
|
||||
super().__init__(bot)
|
||||
openai.api_key = self.config["openai_key"]
|
||||
|
||||
def reply(self, prompt: str, target: str):
|
||||
computing_reply = random.choice(self.config["computing_replies"])
|
||||
self.bot.say(target, computing_reply)
|
||||
|
||||
completion = self.complete(prompt)
|
||||
if completion and (reply := self.sanitize(completion)):
|
||||
self.bot.say(target, reply)
|
||||
else:
|
||||
self.bot.signal_failure(target)
|
||||
|
||||
def complete(self, prompt: str) -> Optional[str]:
|
||||
try:
|
||||
completion = openai.Completion.create(
|
||||
model="text-davinci-002",
|
||||
prompt=prompt,
|
||||
temperature=0.7,
|
||||
max_tokens=128,
|
||||
top_p=1,
|
||||
frequency_penalty=0.5,
|
||||
presence_penalty=0
|
||||
)
|
||||
except openai.error.OpenAIError:
|
||||
return None
|
||||
return completion.choices[0].text
|
||||
|
||||
def sanitize(self, text: str) -> str:
|
||||
text = text.strip()
|
||||
text = re.sub(r"\n+", self.config["join_lines"], text)
|
||||
text = limit_text_length(text)
|
||||
return text
|
Loading…
Reference in new issue