diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..cf68b61c6 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @cohere-ai/connectors \ No newline at end of file diff --git a/confluence/.env-template b/confluence/.env-template index a85d3a002..407f76a7e 100644 --- a/confluence/.env-template +++ b/confluence/.env-template @@ -1,8 +1,8 @@ CONFLUENCE_USER= -CONFLUENCE_PASSWORD= +CONFLUENCE_API_TOKEN= CONFLUENCE_PRODUCT_URL=https://sample.atlassian.net CONFLUENCE_SPACE_NAME= CONFLUENCE_SEARCH_LIMIT=10 # Connector Authorization -CONFLUENCE_CONNECTOR_API_KEY= +CONFLUENCE_CONNECTOR_API_KEY= \ No newline at end of file diff --git a/confluence/README.md b/confluence/README.md index 70e0dfbad..d3f58d4de 100644 --- a/confluence/README.md +++ b/confluence/README.md @@ -13,12 +13,14 @@ This connector requires the following environment variables: ``` CONFLUENCE_USER -CONFLUENCE_PASSWORD +CONFLUENCE_API_TOKEN CONFLUENCE_PRODUCT_URL CONFLUENCE_SPACE_NAME ``` -The user and password combination should be a user email address and an API token pair. +The user and api token combination should be a user email address and an API token pair. +The API token can be generated by logging into Confluence and going +to the API tokens [page](https://id.atlassian.com/manage-profile/security/api-tokens). The product URL should be the URL for the Confluence wiki, including the https:// scheme. The space name should be the name of a single space in your wiki. diff --git a/confluence/dev/load_data.py b/confluence/dev/load_data.py index b2d89730f..501d5516b 100644 --- a/confluence/dev/load_data.py +++ b/confluence/dev/load_data.py @@ -9,8 +9,8 @@ confluence = Confluence( url=os.environ.get("CONFLUENCE_PRODUCT_URL"), - username=os.environ.get("CONFLUENCE_CLIENT_USER"), - password=os.environ.get("CONFLUENCE_CLIENT_PASS"), + username=os.environ.get("CONFLUENCE_USER"), + password=os.environ.get("CONFLUENCE_API_TOKEN"), ) space = os.environ.get("CONFLUENCE_SPACE_NAME") diff --git a/confluence/provider/client.py b/confluence/provider/client.py index b69d653af..f68ba0307 100644 --- a/confluence/provider/client.py +++ b/confluence/provider/client.py @@ -1,6 +1,6 @@ +import asyncio import functools -import asyncio from atlassian import Confluence from flask import current_app as app @@ -10,12 +10,12 @@ class ConfluenceClient: - def __init__(self, url, user, password, space, search_limit=10): + def __init__(self, url, user, api_token, space, search_limit=10): try: self.confluence = Confluence( url=url, username=user, - password=password, + password=api_token, ) self.space = space self.search_limit = search_limit @@ -77,9 +77,11 @@ def get_client(): assert (url := app.config.get("PRODUCT_URL")), "CONFLUENCE_PRODUCT_URL must be set" assert (user := app.config.get("USER")), "CONFLUENCE_USER must be set" - assert (password := app.config.get("PASSWORD")), "CONFLUENCE_PASSWORD must be set" + assert ( + api_token := app.config.get("API_TOKEN") + ), "CONFLUENCE_API_TOKEN must be set" assert (space := app.config.get("SPACE_NAME")), "CONFLUENCE_SPACE_NAME must be set" search_limit = app.config.get("SEARCH_LIMIT", 10) - client = ConfluenceClient(url, user, password, space, search_limit) + client = ConfluenceClient(url, user, api_token, space, search_limit) return client diff --git a/gdrive/README.md b/gdrive/README.md index 62f2e02f9..4dd262874 100644 --- a/gdrive/README.md +++ b/gdrive/README.md @@ -49,6 +49,29 @@ The `GDRIVE_CONNECTOR_API_KEY` should contain an API key for the connector. This When using OAuth for authentication, the connector does not require any additional environment variables. Instead, the OAuth flow should occur outside of the Connector and Cohere's API will forward the user's access token to this connector through the `Authorization` header. +To use OAuth, you must first create a Google OAuth client ID and secret. You can follow Google's [guide](https://developers.google.com/identity/protocols/oauth2/web-server#creatingcred) to get started. When creating your application use `https://api.cohere.com/v1/connectors/oauth/token` as the redirect URI. + +Once your Google OAuth credentials are ready, you can register the connector in Cohere's API with the following configuration: + +```bash +curl -X POST \ + 'https://api.cohere.ai/v1/connectors' \ + --header 'Accept: */*' \ + --header 'Authorization: Bearer {COHERE-API-KEY}' \ + --header 'Content-Type: application/json' \ + --data-raw '{ + "name": "GDrive with OAuth", + "url": "{YOUR_CONNECTOR-URL}", + "oauth": { + "client_id": "{GOOGLE-OAUTH-CLIENT-ID}", + "client_secret": "{GOOGLE-OAUTH-CLIENT-SECRET}", + "authorize_url": "https://accounts.google.com/o/oauth2/auth", + "token_url": "https://oauth2.googleapis.com/token", + "scope": "https://www.googleapis.com/auth/drive.readonly" + } +}' +``` + With OAuth the connector will be able to search any Google Drive folders that the user has access to. ## Optional Configuration @@ -70,8 +93,7 @@ Create a virtual environment and install dependencies with poetry. We recommend Next, start up the search connector server: ```bash - $ poetry shell - $ flask --app provider --debug run --port 5000 + $ poetry flask --app provider --debug run --port 5000 ``` and check with curl to see that everything works: diff --git a/gdrive/provider/provider.py b/gdrive/provider/provider.py index 4b2144aa9..c4444d1dd 100644 --- a/gdrive/provider/provider.py +++ b/gdrive/provider/provider.py @@ -144,4 +144,4 @@ def search(query, access_token=None): except HttpError as http_error: raise UpstreamProviderError(message=str(http_error)) from http_error - return process_data_with_service(search_results, request_credentials) + return process_data_with_service(search_results, request_credentials(access_token))