* support custom openai api endpoints (for azure and local deployments) * update openai python package and use new api format * fix: project member list endpoint n+1 (#1458) * chore: workspace char name and slug maximum length (#1453) * fix: user invitation workflow for self hosted version (#1441) * chore: due date filter (#1460) * refactor: standardized date format throughout the platform (#1461) * chore: due date filter (#965) * chore: due date filter * fix: deployment error * chore: optimized code * chore: created constants for due date * chore: create seperated css file for react datepicker styling * fix: due date filter * chore: highlight selected option * fix: merge conflicts * fix: build error * chore: date range selector validation * fix: issue views overflow * refactor: due date filter modal code * refactor: multi level dropdown * chore: due date filter select default value --------- Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> * fix: layout of tabs on Pages is not adaptable to mobile screens #1380 (#1400) * fix: layout of tabs on Pages is not adaptable to mobile screens #1380 * fix: scrolling experience on page * chore: update project members type (#1459) * fix: state icon color on group titles (#1435) * fix: workspace invitation delete for self hosted (#1475) * chore: upgrade backend dependencies (#1479) * chore: upgrade backend dependencies * dev: update storage settings for self hosted version * chore: project members endpoint to support bulk operations (#1464) * chore: rename workspace company size to organization size (#1463) * chore: rename workspace company size to organization size * chore: make workspace organization size as required * fix: static and media files storages (#1482) * fix: emoji render function (#1484) * fix: emoji render function * fix: emoji render function * feat: bulk invite for project (#1466) * feat: bulk invite for project * feat: members dropdown updated * fix: error message added ,style: ui improvement * feat: added add members button for scenarios with multiple members * chore: updated watch to fields * feat: created on and updated on column added in spreadsheet view (#1454) * feat: created on and updated on column added in spreadsheet view * fix: build fix * refactor: simplify logic --------- Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> * fix: resolved overflow issue with longer state names (#1444) * chore: update theming structure (#1422) * chore: store various shades of accent color * refactor: custom theme selector * refactor: custom theme selector * chore: update custom theme input labels * fix: color generator function logic * fix: accent color preloaded data * chore: new theming structure * chore: update shades calculation logic * refactor: variable names * chore: update color scheming * chore: new color scheming * refactor: themes folder structure * chore: update classnames according to new variables * Revert "chore: update classnames according to new variables" This reverts commit 60a87453b21768167e37889e709c12287ca07b08. * chore: remove temp file * chore: update classnames according to the new theming structure (#1494) * chore: store various shades of accent color * refactor: custom theme selector * refactor: custom theme selector * chore: update custom theme input labels * fix: color generator function logic * fix: accent color preloaded data * chore: new theming structure * chore: update shades calculation logic * refactor: variable names * chore: update color scheming * chore: new color scheming * refactor: themes folder structure * chore: update classnames to the new ones * chore: update static colors * chore: sidebar link colors * chore: placeholder color * chore: update border classnames * chore: environment variables for worker and api (#1492) * feat: notifications (#1363) * feat: added new issue subscriber table * dev: notification model * feat: added CRUD operation for issue subscriber * Revert "feat: added CRUD operation for issue subscriber" This reverts commit b22e0625768f0b096b5898936ace76d6882b0736. * feat: added CRUD operation for issue subscriber * dev: notification models and operations * dev: remove delete endpoint response data * dev: notification endpoints and fix bg worker for saving notifications * feat: added list and unsubscribe function in issue subscriber * dev: filter by snoozed and response update for list and permissions * dev: update issue notifications * dev: notification segregation * dev: update notifications * dev: notification filtering * dev: add issue name in notifications * dev: notification new endpoints --------- Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> * fix: docker inconsistencies (#1493) Co-authored-by: pablohashescobar <118773738+pablohashescobar@users.noreply.github.com> * feat: issue archival and close (#1474) * chore: added issue archive using celery beat * chore: changed the file name * fix: created API and updated logic for achived-issues * chore: added issue activity message * chore: added the beat scheduler command * feat: added unarchive issue functionality * feat: auto issue close * dev: refactor endpoints and issue archive activity * dev: update manager for global filtering * fix: added id in issue unarchive url * dev: update auto close to include default close state * fix: updated the list and retrive function * fix: added the prefetch fields * dev: update unarchive --------- Co-authored-by: pablohashescobar <nikhilschacko@gmail.com> * fix: updated text and background colors (#1496) * fix: custom colors opacity * chore: update text colors for dark mode * fix: dropdown text colors, datepicker bg color * chore: update text colors * chore: updated primary bg color * feat: web waitlist modal integration (#1487) * dev : Updating the limit of the issues in the sidebar and a weight list modal * dev: integrated supabase and implemented web waitlist api endpoint * dev : updated web pro weightlist request * dev: rename typo * dev: web waitlist endpoint update * update: ui fixes * fix: removed supabase from env.example * chore: replaced supabase npm package to cdn * chore: updated supabase req * fix: Handled error status and error message. --------- Co-authored-by: srinivaspendem <you@example.comsrinivaspendem2612@gmail.com> Co-authored-by: gurusainath <gurusainath007@gmail.com> * add openai host env in all places --------- Co-authored-by: Ankur Singh <ankur.singh@epfl.ch> Co-authored-by: pablohashescobar <118773738+pablohashescobar@users.noreply.github.com> Co-authored-by: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com> Co-authored-by: Kunal Vishwakarma <116634168+kunalv17@users.noreply.github.com> Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com> Co-authored-by: Chandan Jal <97095857+ChandanJal@users.noreply.github.com> Co-authored-by: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Co-authored-by: NarayanBavisetti <narayan3119@gmail.com> Co-authored-by: Quadrubo <71718414+Quadrubo@users.noreply.github.com> Co-authored-by: Bavisetti Narayan <72156168+NarayanBavisetti@users.noreply.github.com> Co-authored-by: pablohashescobar <nikhilschacko@gmail.com> Co-authored-by: srinivas pendem <65014795+srinivaspendem@users.noreply.github.com> Co-authored-by: srinivaspendem <you@example.comsrinivaspendem2612@gmail.com> Co-authored-by: gurusainath <gurusainath007@gmail.com>
101 lines
3.5 KiB
Python
101 lines
3.5 KiB
Python
# Python imports
|
|
import requests
|
|
|
|
# Third party imports
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
import openai
|
|
from sentry_sdk import capture_exception
|
|
|
|
# Django imports
|
|
from django.conf import settings
|
|
|
|
# Module imports
|
|
from .base import BaseAPIView
|
|
from plane.api.permissions import ProjectEntityPermission
|
|
from plane.db.models import Workspace, Project
|
|
from plane.api.serializers import ProjectLiteSerializer, WorkspaceLiteSerializer
|
|
|
|
|
|
class GPTIntegrationEndpoint(BaseAPIView):
|
|
permission_classes = [
|
|
ProjectEntityPermission,
|
|
]
|
|
|
|
def post(self, request, slug, project_id):
|
|
try:
|
|
if not settings.OPENAI_API_KEY or not settings.GPT_ENGINE:
|
|
return Response(
|
|
{"error": "OpenAI API key and engine is required"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
count = 0
|
|
|
|
# If logger is enabled check for request limit
|
|
if settings.LOGGER_BASE_URL:
|
|
try:
|
|
headers = {
|
|
"Content-Type": "application/json",
|
|
}
|
|
|
|
response = requests.post(
|
|
settings.LOGGER_BASE_URL,
|
|
json={"user_id": str(request.user.id)},
|
|
headers=headers,
|
|
)
|
|
count = response.json().get("count", 0)
|
|
if not response.json().get("success", False):
|
|
return Response(
|
|
{
|
|
"error": "You have surpassed the monthly limit for AI assistance"
|
|
},
|
|
status=status.HTTP_429_TOO_MANY_REQUESTS,
|
|
)
|
|
except Exception as e:
|
|
capture_exception(e)
|
|
|
|
prompt = request.data.get("prompt", False)
|
|
task = request.data.get("task", False)
|
|
|
|
if not task:
|
|
return Response(
|
|
{"error": "Task is required"}, status=status.HTTP_400_BAD_REQUEST
|
|
)
|
|
|
|
final_text = task + "\n" + prompt
|
|
|
|
openai.api_key = settings.OPENAI_API_KEY
|
|
response = openai.Completion.create(
|
|
model=settings.GPT_ENGINE,
|
|
prompt=final_text,
|
|
temperature=0.7,
|
|
max_tokens=1024,
|
|
)
|
|
|
|
workspace = Workspace.objects.get(slug=slug)
|
|
project = Project.objects.get(pk=project_id)
|
|
|
|
text = response.choices[0].text.strip()
|
|
text_html = text.replace("\n", "<br/>")
|
|
return Response(
|
|
{
|
|
"response": text,
|
|
"response_html": text_html,
|
|
"count": count,
|
|
"project_detail": ProjectLiteSerializer(project).data,
|
|
"workspace_detail": WorkspaceLiteSerializer(workspace).data,
|
|
},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
except (Workspace.DoesNotExist, Project.DoesNotExist) as e:
|
|
return Response(
|
|
{"error": "Workspace or Project Does not exist"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
except Exception as e:
|
|
capture_exception(e)
|
|
return Response(
|
|
{"error": "Something went wrong please try again later"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|