Skip to content

Commit

Permalink
Add MetalRetriever (#613)
Browse files Browse the repository at this point in the history
* Add MetalRetriever

* Add docs and example

* Lint
  • Loading branch information
nfcampos authored Apr 6, 2023
1 parent eaa7e78 commit 047691f
Show file tree
Hide file tree
Showing 10 changed files with 126 additions and 3 deletions.
16 changes: 16 additions & 0 deletions docs/docs/modules/indexes/retrievers/metal-retriever.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Remote Retriever

This example shows how to use the Metal Retriever in a `RetrievalQAChain` to retrieve documents from Metal index.

## Setup

```bash npm2yarn
npm i @getmetal/metal-sdk
```

## Usage

import CodeBlock from "@theme/CodeBlock";
import Example from "@examples/retrievers/metal.ts";

<CodeBlock language="typescript">{Example}</CodeBlock>
2 changes: 1 addition & 1 deletion docs/docs/modules/indexes/retrievers/remote-retriever.mdx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Remote Retriever

This example shows how to use the a Remote Retriever in a `RetrievalQAChain` to retrieve documents from a remote server.
This example shows how to use a Remote Retriever in a `RetrievalQAChain` to retrieve documents from a remote server.

## Usage

Expand Down
1 change: 1 addition & 0 deletions examples/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"license": "MIT",
"dependencies": {
"@dqbd/tiktoken": "^1.0.2",
"@getmetal/metal-sdk": "^1.0.12",
"@pinecone-database/pinecone": "^0.0.10",
"@supabase/supabase-js": "^2.10.0",
"chromadb": "^1.3.0",
Expand Down
17 changes: 17 additions & 0 deletions examples/src/retrievers/metal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Metal from "@getmetal/metal-sdk";
import { MetalRetriever } from "langchain/retrievers";

export const run = async () => {
const MetalSDK = Metal.default;

const client = new MetalSDK(
process.env.METAL_API_KEY!,
process.env.METAL_CLIENT_ID!,
process.env.METAL_APP_ID
);
const retriever = new MetalRetriever({ client });

const docs = await retriever.getRelevantDocuments("hello");

console.log(docs);
};
5 changes: 5 additions & 0 deletions langchain/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
"@babel/preset-env": "^7.20.2",
"@dqbd/tiktoken": "^1.0.2",
"@faker-js/faker": "^7.6.0",
"@getmetal/metal-sdk": "^1.0.12",
"@huggingface/inference": "^1.5.1",
"@jest/globals": "^29.5.0",
"@pinecone-database/pinecone": "^0.0.10",
Expand Down Expand Up @@ -147,6 +148,7 @@
},
"peerDependencies": {
"@dqbd/tiktoken": "^1.0.2",
"@getmetal/metal-sdk": "*",
"@huggingface/inference": "^1.5.1",
"@pinecone-database/pinecone": "^0.0.10",
"@supabase/supabase-js": "^2.10.0",
Expand All @@ -169,6 +171,9 @@
"@dqbd/tiktoken": {
"optional": true
},
"@getmetal/metal-sdk": {
"optional": true
},
"@huggingface/inference": {
"optional": true
},
Expand Down
1 change: 1 addition & 0 deletions langchain/src/retrievers/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ export {
SupabaseHybridSearchParams,
} from "./supabase-hybrid-search.js";
export { RemoteLangChainRetriever } from "./remote/remote-retriever.js";
export { MetalRetriever } from "./metal.js";
36 changes: 36 additions & 0 deletions langchain/src/retrievers/metal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import type MetalSDK from "@getmetal/metal-sdk";

import { BaseRetriever } from "../schema/index.js";
import { Document } from "../document.js";

export interface MetalRetrieverFields {
client: MetalSDK.default;
}

interface ResponseItem {
text: string;
[key: string]: unknown;
}

export class MetalRetriever extends BaseRetriever {
client: MetalSDK.default;

constructor(fields: MetalRetrieverFields) {
super();

this.client = fields.client;
}

async getRelevantDocuments(query: string): Promise<Document[]> {
const res = await this.client.search({ text: query });

const items = ("data" in res ? res.data : res) as ResponseItem[];
return items.map(
({ text, metadata }) =>
new Document({
pageContent: text,
metadata: metadata as Record<string, unknown>,
})
);
}
}
22 changes: 22 additions & 0 deletions langchain/src/retrievers/tests/metal.int.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/* eslint-disable no-process-env */
/* eslint-disable @typescript-eslint/no-non-null-assertion */
import { test, expect } from "@jest/globals";
import Metal from "@getmetal/metal-sdk";

import { MetalRetriever } from "../metal.js";

test("MetalRetriever", async () => {
const MetalSDK = Metal.default;
const client = new MetalSDK(
process.env.METAL_API_KEY!,
process.env.METAL_CLIENT_ID!,
process.env.METAL_APP_ID
);
const retriever = new MetalRetriever({ client });

const docs = await retriever.getRelevantDocuments("hello");

expect(docs.length).toBeGreaterThan(0);

console.log(docs);
});
29 changes: 27 additions & 2 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -2506,6 +2506,15 @@ __metadata:
languageName: node
linkType: hard

"@getmetal/metal-sdk@npm:^1.0.12":
version: 1.0.12
resolution: "@getmetal/metal-sdk@npm:1.0.12"
dependencies:
axios: ^1.3.2
checksum: 46e3f7876b2aaad759c32a348df078c093fae89205e7050040f80300d04a0c7f1973562d1b9df74b453e2aad316fbfa5d88565e38b33c285d474cdb0356f18f3
languageName: node
linkType: hard

"@hapi/hoek@npm:^9.0.0":
version: 9.3.0
resolution: "@hapi/hoek@npm:9.3.0"
Expand Down Expand Up @@ -5052,6 +5061,17 @@ __metadata:
languageName: node
linkType: hard

"axios@npm:^1.3.2":
version: 1.3.4
resolution: "axios@npm:1.3.4"
dependencies:
follow-redirects: ^1.15.0
form-data: ^4.0.0
proxy-from-env: ^1.1.0
checksum: 7440edefcf8498bc3cdf39de00443e8101f249972c83b739c6e880d9d669fea9486372dbe8739e88b3bf8bb1ad15f6106693f206f078f4516fe8fd47b1c3093c
languageName: node
linkType: hard

"axobject-query@npm:^3.1.1":
version: 3.1.1
resolution: "axobject-query@npm:3.1.1"
Expand Down Expand Up @@ -8692,7 +8712,7 @@ __metadata:
languageName: node
linkType: hard

"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8":
"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7, follow-redirects@npm:^1.14.8, follow-redirects@npm:^1.15.0":
version: 1.15.2
resolution: "follow-redirects@npm:1.15.2"
peerDependenciesMeta:
Expand Down Expand Up @@ -11387,6 +11407,7 @@ __metadata:
resolution: "langchain-examples@workspace:examples"
dependencies:
"@dqbd/tiktoken": ^1.0.2
"@getmetal/metal-sdk": ^1.0.12
"@pinecone-database/pinecone": ^0.0.10
"@supabase/supabase-js": ^2.10.0
"@tsconfig/recommended": ^1.0.2
Expand Down Expand Up @@ -11421,6 +11442,7 @@ __metadata:
"@dqbd/tiktoken": ^1.0.2
"@faker-js/faker": ^7.6.0
"@fortaine/fetch-event-source": ^3.0.6
"@getmetal/metal-sdk": ^1.0.12
"@huggingface/inference": ^1.5.1
"@jest/globals": ^29.5.0
"@pinecone-database/pinecone": ^0.0.10
Expand Down Expand Up @@ -11479,6 +11501,7 @@ __metadata:
zod: ^3.21.4
peerDependencies:
"@dqbd/tiktoken": ^1.0.2
"@getmetal/metal-sdk": "*"
"@huggingface/inference": ^1.5.1
"@pinecone-database/pinecone": ^0.0.10
"@supabase/supabase-js": ^2.10.0
Expand All @@ -11499,6 +11522,8 @@ __metadata:
peerDependenciesMeta:
"@dqbd/tiktoken":
optional: true
"@getmetal/metal-sdk":
optional: true
"@huggingface/inference":
optional: true
"@pinecone-database/pinecone":
Expand Down Expand Up @@ -14237,7 +14262,7 @@ __metadata:
languageName: node
linkType: hard

"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.0.0":
"proxy-from-env@npm:1.1.0, proxy-from-env@npm:^1.0.0, proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4
Expand Down

1 comment on commit 047691f

@vercel
Copy link

@vercel vercel bot commented on 047691f Apr 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.