mirror of https://github.com/hwchase17/langchain
Dev2049/add modern treasury (#3924)
Modified Modern Treasury and Strip slightly so credentials don't have to be passed in explicitly. Thanks @mattgmarcus for adding Modern Treasury! --------- Co-authored-by: Matt Marcus <matt.g.marcus@gmail.com>pull/3916/head^2
parent
5db6b796cf
commit
e7e29f9937
@ -0,0 +1,106 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Modern Treasury\n",
|
||||
"\n",
|
||||
"This notebook covers how to load data from the Modern Treasury REST API into a format that can be ingested into LangChain, along with example usage for vectorization."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import os\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"from langchain.document_loaders import ModernTreasuryLoader\n",
|
||||
"from langchain.indexes import VectorstoreIndexCreator"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"The Modern Treasury API requires an organization ID and API key, which can be found in the Modern Treasury dashboard within developer settings.\n",
|
||||
"\n",
|
||||
"This document loader also requires a `resource` option which defines what data you want to load.\n",
|
||||
"\n",
|
||||
"Following resources are available:\n",
|
||||
"\n",
|
||||
"`payment_orders` [Documentation](https://docs.moderntreasury.com/reference/payment-order-object)\n",
|
||||
"\n",
|
||||
"`expected_payments` [Documentation](https://docs.moderntreasury.com/reference/expected-payment-object)\n",
|
||||
"\n",
|
||||
"`returns` [Documentation](https://docs.moderntreasury.com/reference/return-object)\n",
|
||||
"\n",
|
||||
"`incoming_payment_details` [Documentation](https://docs.moderntreasury.com/reference/incoming-payment-detail-object)\n",
|
||||
"\n",
|
||||
"`counterparties` [Documentation](https://docs.moderntreasury.com/reference/counterparty-object)\n",
|
||||
"\n",
|
||||
"`internal_accounts` [Documentation](https://docs.moderntreasury.com/reference/internal-account-object)\n",
|
||||
"\n",
|
||||
"`external_accounts` [Documentation](https://docs.moderntreasury.com/reference/external-account-object)\n",
|
||||
"\n",
|
||||
"`transactions` [Documentation](https://docs.moderntreasury.com/reference/transaction-object)\n",
|
||||
"\n",
|
||||
"`ledgers` [Documentation](https://docs.moderntreasury.com/reference/ledger-object)\n",
|
||||
"\n",
|
||||
"`ledger_accounts` [Documentation](https://docs.moderntreasury.com/reference/ledger-account-object)\n",
|
||||
"\n",
|
||||
"`ledger_transactions` [Documentation](https://docs.moderntreasury.com/reference/ledger-transaction-object)\n",
|
||||
"\n",
|
||||
"`events` [Documentation](https://docs.moderntreasury.com/reference/events)\n",
|
||||
"\n",
|
||||
"`invoices` [Documentation](https://docs.moderntreasury.com/reference/invoices)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"modern_treasury_loader = ModernTreasuryLoader(\"payment_orders\")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# Create a vectorstore retriver from the loader\n",
|
||||
"# see https://python.langchain.com/en/latest/modules/indexes/getting_started.html for more details\n",
|
||||
"\n",
|
||||
"index = VectorstoreIndexCreator().from_loaders([modern_treasury_loader])\n",
|
||||
"modern_treasury_doc_retriever = index.vectorstore.as_retriever()"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.11.3"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
@ -0,0 +1,61 @@
|
||||
"""Loader that fetches data from Modern Treasury"""
|
||||
import json
|
||||
import urllib.request
|
||||
from base64 import b64encode
|
||||
from typing import List, Optional
|
||||
|
||||
from langchain.docstore.document import Document
|
||||
from langchain.document_loaders.base import BaseLoader
|
||||
from langchain.utils import get_from_env, stringify_value
|
||||
|
||||
MODERN_TREASURY_ENDPOINTS = {
|
||||
"payment_orders": "https://app.moderntreasury.com/api/payment_orders",
|
||||
"expected_payments": "https://app.moderntreasury.com/api/expected_payments",
|
||||
"returns": "https://app.moderntreasury.com/api/returns",
|
||||
"incoming_payment_details": "https://app.moderntreasury.com/api/\
|
||||
incoming_payment_details",
|
||||
"counterparties": "https://app.moderntreasury.com/api/counterparties",
|
||||
"internal_accounts": "https://app.moderntreasury.com/api/internal_accounts",
|
||||
"external_accounts": "https://app.moderntreasury.com/api/external_accounts",
|
||||
"transactions": "https://app.moderntreasury.com/api/transactions",
|
||||
"ledgers": "https://app.moderntreasury.com/api/ledgers",
|
||||
"ledger_accounts": "https://app.moderntreasury.com/api/ledger_accounts",
|
||||
"ledger_transactions": "https://app.moderntreasury.com/api/ledger_transactions",
|
||||
"events": "https://app.moderntreasury.com/api/events",
|
||||
"invoices": "https://app.moderntreasury.com/api/invoices",
|
||||
}
|
||||
|
||||
|
||||
class ModernTreasuryLoader(BaseLoader):
|
||||
def __init__(
|
||||
self,
|
||||
resource: str,
|
||||
organization_id: Optional[str] = None,
|
||||
api_key: Optional[str] = None,
|
||||
) -> None:
|
||||
self.resource = resource
|
||||
organization_id = organization_id or get_from_env(
|
||||
"organization_id", "MODERN_TREASURY_ORGANIZATION_ID"
|
||||
)
|
||||
api_key = api_key or get_from_env("api_key", "MODERN_TREASURY_API_KEY")
|
||||
credentials = f"{organization_id}:{api_key}".encode("utf-8")
|
||||
basic_auth_token = b64encode(credentials).decode("utf-8")
|
||||
self.headers = {"Authorization": f"Basic {basic_auth_token}"}
|
||||
|
||||
def _make_request(self, url: str) -> List[Document]:
|
||||
request = urllib.request.Request(url, headers=self.headers)
|
||||
|
||||
with urllib.request.urlopen(request) as response:
|
||||
json_data = json.loads(response.read().decode())
|
||||
text = stringify_value(json_data)
|
||||
metadata = {"source": url}
|
||||
return [Document(page_content=text, metadata=metadata)]
|
||||
|
||||
def _get_resource(self) -> List[Document]:
|
||||
endpoint = MODERN_TREASURY_ENDPOINTS.get(self.resource)
|
||||
if endpoint is None:
|
||||
return []
|
||||
return self._make_request(endpoint)
|
||||
|
||||
def load(self) -> List[Document]:
|
||||
return self._get_resource()
|
@ -0,0 +1,9 @@
|
||||
from langchain.document_loaders.modern_treasury import ModernTreasuryLoader
|
||||
|
||||
|
||||
def test_modern_treasury_loader() -> None:
|
||||
"""Test Modern Treasury file loader."""
|
||||
modern_treasury_loader = ModernTreasuryLoader("payment_orders")
|
||||
documents = modern_treasury_loader.load()
|
||||
|
||||
assert len(documents) == 1
|
@ -1,12 +1,9 @@
|
||||
from langchain.document_loaders.stripe import StripeLoader
|
||||
|
||||
access_token = ""
|
||||
resource = "charges"
|
||||
|
||||
|
||||
def test_stripe_loader() -> None:
|
||||
"""Test Figma file loader."""
|
||||
stripe_loader = StripeLoader(access_token, resource)
|
||||
"""Test Stripe file loader."""
|
||||
stripe_loader = StripeLoader("charges")
|
||||
documents = stripe_loader.load()
|
||||
|
||||
assert len(documents) == 1
|
||||
|
Loading…
Reference in New Issue