slackbot
Last updated
Was this helpful?
Last updated
Was this helpful?
설정이 조금 복잡하기는 합니다만 인터넷에 많이 나와있으니 한번 확인해보시기 바랍니다.
결론은 slack app을 하나 만들고 다음 토큰을 받으면 됩니다.
SLACK_BOT_TOKEN=xxx
SLACK_APP_TOKEN=xxx
SLACK_SIGNING_SECRET=xxx
물론 필요한 권한이 있어야합니다.
%pip install --user -Uq slackclient
.env파일을 설정을 잘 하셔야 합니다.
web api mode : web server가 있어야함.
socket mode : web server가 필요없음.
https://api.slack.com/web
https://api.slack.com/apis/socket-mode
소켓 모드는 슬랙 봇이 이벤트나 상호작용을 처리할 때 사용하는 방법 중 하나야.
원래는 슬랙이 봇에게 데이터를 보내려면 인터넷 주소가 필요했어. 하지만 소켓 모드는 인터넷 주소 없이도 데이터를 주고받을 수 있어.
그래서 난 소켓 모드를 사용할 거야.
슬랙에서는 개발자 라이브러리를 오픈햇어 이것이 bolt임
https://slack.dev/bolt-python/concepts
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
from slack_bolt.adapter.socket_mode import SocketModeHandler
from slack_bolt import App
import slack
import os
from dotenv import load_dotenv
load_dotenv()
app = App(
token=os.environ.get("SLACK_BOT_TOKEN"),
signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)
prompt = ChatPromptTemplate.from_messages(
[
("system", "당신은 인간과 대화하는 유용한 AI입니다, 답을 모른다면 그냥 모른다고 말하고 지어내지 마세요"),
("human", "{question}"),
]
)
llm = ChatOpenAI(
temperature=0
)
chain = prompt | llm | StrOutputParser()
@app.message(".*")
def message_handler(message, say):
print(message)
output = chain.invoke({"question": message['text']})
say(output)
# Start your app
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()
import os
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
from jira import JIRA
from dotenv import load_dotenv
load_dotenv()
app = App(
token=os.environ.get("SLACK_BOT_TOKEN"),
signing_secret=os.environ.get("SLACK_SIGNING_SECRET")
)
# Langchain implementation
llm = ChatOpenAI(
temperature=0.1, # 창의성 (0.0 ~ 2.0)
)
jira = JIRA(server=os.environ['JIRA_URL'],
basic_auth=(
os.environ['JIRA_EMAIL'],
os.environ['JIRA_TOKEN'])
)
def getJiraIssue(issue_key):
# 특정 이슈를 가져옴
# issue = jira.issue('NETOP-14473')
issue = jira.issue(issue_key)
# 필드를 저장할 새로운 사전을 생성
issue_fields = {}
# 이슈의 모든 필드를 확인
for field_name, field_value in vars(issue.fields).items():
# 필드 이름이 'customfield'로 시작하고 값이 None인 필드는 제외
if not (field_name.startswith('customfield') and field_value is None):
issue_fields[field_name] = field_value
return issue_fields
template = """
JIRA 이슈 데이터는 `key: value` 형태로 되어있고 value는 줄바꿈 문자가 있는곳까지 포함합니다.
주어진 JIRA 이슈 데이터에서 서버 이름, VCPU, 메모리, OS 이름을 추출하여 Ansible 플레이북 커맨드를 생성해 주세요.
서버 이름이 여러 인스턴스를 포함하는 경우 각 인스턴스에 대해 별도의 Ansible 플레이북 커맨드를 생성해 주세요.
vcpu갯수는 customfield_10148 의 값을 사용해야하는데 문장 끝까지 인식해주세요 거기에서 숫자만 추출하면 됩니다.
vcpu가 있으고 cpu가 없는 경우 cpu는 vcpu의 절반으로 설정해 주세요.
cpu가 있고 vcpu가 없으면 vcpu는 cpu의 2배로 설정해 주세요.
둘다 없으면 cpu=1, vcpu=2로 설정해 주세요.
os_name은 customfield_10165 에서 공백을 제거한 문자열로 설정해 주세요.
os_version은 customfield_10166 에서 공백을 제거한 문자열로 설정해 주세요.
os_version이 없는경우는 oraclelinux는 9.3 , centos는 7.8로 설정해주세요
JIRA 이슈 데이터는 다음과 같습니다:
{ISSUE_DATA}
SAMPLE) here is Ansible Playbook Command SAMPLE
ansible-playbook create-vm.yaml \
-e "server_name=**server_name**" \
-e "cpu=**cpu**" \
-e "vcpu=**vcpu**" \
-e "memory=**memory**" \
-e "image_name=**os_name**-**os_version**" \
-e "network_name=Private"
Please Make Correct Ansible Playbook Command use above sample
답변은 아래처럼 보여줘. 결과만 보여줘
ANSWER) Ansible Playbook Command
ansible-playbook create-vm.yaml \
-e "server_name=**server_name**" \
-e "cpu=**cpu**" \
-e "vcpu=**vcpu**" \
-e "memory=**memory**" \
-e "image_name=**os_name**-**os_version**" \
-e "network_name=Private"
답변은 한글로 해주세요
"""
prompt = PromptTemplate.from_template(template=template)
chain = prompt | llm | StrOutputParser()
# @app.message(".*")
# def message_handler(message, say):
# print(message)
# say(output)
@app.message("build")
def message_build(message, say):
print(message)
ticket_number = message['text'].replace('build', '').strip()
jira = getJiraIssue(ticket_number)
print(jira)
output = chain.invoke({"ISSUE_DATA": jira})
say(output)
# @app.event("message")
# def handle_message_events(body, logger):
# logger.info(body)
# Start your app
if __name__ == "__main__":
SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"]).start()