diff --git a/src/backend/base/langflow/components/documentloaders/Confluence.py b/src/backend/base/langflow/components/documentloaders/Confluence.py new file mode 100644 index 000000000..66ff5f7fe --- /dev/null +++ b/src/backend/base/langflow/components/documentloaders/Confluence.py @@ -0,0 +1,85 @@ +from typing import List +from langflow.custom import Component +from langflow.io import StrInput, SecretStrInput, BoolInput, DropdownInput, Output, IntInput +from langflow.schema import Data +from langchain_community.document_loaders import ConfluenceLoader +from langchain_community.document_loaders.confluence import ContentFormat + + +class ConfluenceComponent(Component): + display_name = "Confluence" + description = "Confluence wiki collaboration platform" + documentation = "https://python.langchain.com/v0.2/docs/integrations/document_loaders/confluence/" + trace_type = "tool" + icon = "Confluence" + name = "Confluence" + + inputs = [ + StrInput( + name="url", + display_name="Site URL", + required=True, + info="The base URL of the Confluence Space. Example: https://.atlassian.net/wiki.", + ), + StrInput( + name="username", + display_name="Username", + required=True, + info="Atlassian User E-mail. Example: email@example.com", + ), + SecretStrInput( + name="api_key", + display_name="API Key", + required=True, + info="Atlassian Key. Create at: https://id.atlassian.com/manage-profile/security/api-tokens", + ), + StrInput(name="space_key", display_name="Space Key", required=True), + BoolInput(name="cloud", display_name="Use Cloud?", required=True, value=True, advanced=True), + DropdownInput( + name="content_format", + display_name="Content Format", + options=[ + ContentFormat.EDITOR.value, + ContentFormat.EXPORT_VIEW.value, + ContentFormat.ANONYMOUS_EXPORT_VIEW.value, + ContentFormat.STORAGE.value, + ContentFormat.VIEW.value, + ], + value=ContentFormat.STORAGE.value, + required=True, + advanced=True, + info="Specify content format, defaults to ContentFormat.STORAGE", + ), + IntInput( + name="max_pages", + display_name="Max Pages", + required=False, + value=1000, + advanced=True, + info="Maximum number of pages to retrieve in total, defaults 1000", + ), + ] + + outputs = [ + Output(name="data", display_name="Data", method="load_documents"), + ] + + def build_confluence(self) -> ConfluenceLoader: + content_format = ContentFormat(self.content_format) + loader = ConfluenceLoader( + url=self.url, + username=self.username, + api_key=self.api_key, + cloud=self.cloud, + space_key=self.space_key, + content_format=content_format, + max_pages=self.max_pages, + ) + return loader + + def load_documents(self) -> List[Data]: + confluence = self.build_confluence() + documents = confluence.load() + data = [Data.from_document(doc) for doc in documents] # Using the from_document method of Data + self.status = data + return data diff --git a/src/backend/base/langflow/components/documentloaders/__init__.py b/src/backend/base/langflow/components/documentloaders/__init__.py index e69de29bb..d33437c75 100644 --- a/src/backend/base/langflow/components/documentloaders/__init__.py +++ b/src/backend/base/langflow/components/documentloaders/__init__.py @@ -0,0 +1,3 @@ +from .Confluence import ConfluenceComponent + +__all__ = ["ConfluenceComponent"] diff --git a/src/frontend/src/icons/Confluence/Confluence.jsx b/src/frontend/src/icons/Confluence/Confluence.jsx new file mode 100644 index 000000000..a11e95a23 --- /dev/null +++ b/src/frontend/src/icons/Confluence/Confluence.jsx @@ -0,0 +1,25 @@ +const ConfluenceIcon = (props) => ( + + + + +); + +export default ConfluenceIcon; diff --git a/src/frontend/src/icons/Confluence/Confluence.svg b/src/frontend/src/icons/Confluence/Confluence.svg new file mode 100644 index 000000000..f78072aa4 --- /dev/null +++ b/src/frontend/src/icons/Confluence/Confluence.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/frontend/src/icons/Confluence/index.tsx b/src/frontend/src/icons/Confluence/index.tsx new file mode 100644 index 000000000..fc695ad47 --- /dev/null +++ b/src/frontend/src/icons/Confluence/index.tsx @@ -0,0 +1,9 @@ +import React, { forwardRef } from "react"; +import SvgConfluence from "./Confluence"; + +export const ConfluenceIcon = forwardRef< + SVGSVGElement, + React.PropsWithChildren<{}> +>((props, ref) => { + return ; +}); diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index c3a4bf30c..6ad2d94f0 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -168,6 +168,7 @@ import { BotMessageSquareIcon } from "../icons/BotMessageSquare"; import { CassandraIcon } from "../icons/Cassandra"; import { ChromaIcon } from "../icons/ChromaIcon"; import { CohereIcon } from "../icons/Cohere"; +import { ConfluenceIcon } from "../icons/Confluence"; import { CouchbaseIcon } from "../icons/Couchbase"; import { CrewAiIcon } from "../icons/CrewAI"; import { ElasticsearchIcon } from "../icons/ElasticsearchStore"; @@ -578,5 +579,6 @@ export const nodeIconsLucide: iconsType = { MistralAI: MistralIcon, Upstash: UpstashSvgIcon, PGVector: CpuIcon, + Confluence: ConfluenceIcon, FreezeAll: freezeAllIcon, };