Skip to content

Commit

Permalink
feat: add langchain service
Browse files Browse the repository at this point in the history
  • Loading branch information
sinedied committed Sep 1, 2023
1 parent e43d22e commit f23b342
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 8 deletions.
4 changes: 2 additions & 2 deletions packages/api/src/lib/approaches/approach-base.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SearchClient } from '@azure/search-documents';
import { OpenAiClients } from '../../plugins/openai.js';
import { OpenAiService } from '../../plugins/openai.js';
import { removeNewlines } from '../util/index.js';

export interface SearchDocumentsResult {
Expand All @@ -11,7 +11,7 @@ export interface SearchDocumentsResult {
export class ApproachBase {
constructor(
protected search: SearchClient<any>,
protected openai: OpenAiClients,
protected openai: OpenAiService,
protected chatGptModel: string,
protected sourcePageField: string,
protected contentField: string,
Expand Down
4 changes: 2 additions & 2 deletions packages/api/src/lib/approaches/ask-retrieve-then-read.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SearchClient } from '@azure/search-documents';
import { OpenAiClients } from '../../plugins/openai.js';
import { OpenAiService } from '../../plugins/openai.js';
import { messagesToString } from '../message.js';
import { MessageBuilder } from '../message-builder.js';
import { AskApproach } from './approach.js';
Expand Down Expand Up @@ -33,7 +33,7 @@ const ANSWER = `In-network deductibles are $500 for employee and $1000 for famil
export class AskRetrieveThenRead extends ApproachBase implements AskApproach {
constructor(
search: SearchClient<any>,
openai: OpenAiClients,
openai: OpenAiService,
chatGptModel: string,
sourcePageField: string,
contentField: string,
Expand Down
4 changes: 2 additions & 2 deletions packages/api/src/lib/approaches/chat-read-retrieve-read.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { SearchClient } from '@azure/search-documents';
import { OpenAiClients } from '../../plugins/openai.js';
import { OpenAiService } from '../../plugins/openai.js';
import { ChatApproach, ApproachResponse } from './approach.js';
import { ApproachBase } from './approach-base.js';
import { HistoryMessage, Message, messagesToString } from '../message.js';
Expand Down Expand Up @@ -45,7 +45,7 @@ export class ChatReadRetrieveRead extends ApproachBase implements ChatApproach {

constructor(
search: SearchClient<any>,
openai: OpenAiClients,
openai: OpenAiService,
chatGptModel: string,
sourcePageField: string,
contentField: string,
Expand Down
49 changes: 49 additions & 0 deletions packages/api/src/plugins/langchain.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import fp from 'fastify-plugin';
import { OpenAIChatInput } from 'langchain/dist/types/openai-types';
import { ChatOpenAI } from 'langchain/chat_models/openai';
import { OpenAIEmbeddings } from 'langchain/embeddings/openai';

export type LangchainService = {
getChat(): Promise<ChatOpenAI>;
getEmbeddings(): Promise<OpenAIEmbeddings>;
};

export default fp(
async (fastify, opts) => {
const config = fastify.config;
const getAzureOpenAiOptions = (apiToken: string) => ({
azureOpenAIApiVersion: fastify.openai.config.apiVersion,
azureOpenAIApiKey: apiToken,
azureOpenAIBasePath: `${fastify.openai.config.apiUrl}/openai/deployments`,
azureOpenAIApiDeploymentName: config.azureOpenAiChatGptDeployment,
});

fastify.decorate('langchain', {
async getChat(options?: Partial<OpenAIChatInput>) {
const apiToken = await fastify.openai.getApiToken();
return new ChatOpenAI({
...options,
...getAzureOpenAiOptions(apiToken),
});
},
async getEmbeddings(options?: Partial<OpenAIChatInput>) {
const apiToken = await fastify.openai.getApiToken();
return new OpenAIEmbeddings({
...options,
...getAzureOpenAiOptions(apiToken),
});
},
});
},
{
name: 'langchain',
dependencies: ['azure', 'config', 'openai'],
},
);

// When using .decorate you have to specify added properties for Typescript
declare module 'fastify' {
export interface FastifyInstance {
langchain: LangchainService;
}
}
17 changes: 15 additions & 2 deletions packages/api/src/plugins/openai.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@ import { AccessToken } from '@azure/core-http';
import { OpenAI } from 'openai';
import { Chat, Embeddings } from 'openai/resources/index';

export type OpenAiClients = {
export type OpenAiService = {
getChat(): Promise<Chat>;
getEmbeddings(): Promise<Embeddings>;
getApiToken(): Promise<string>;
config: {
apiVersion: string;
apiUrl: string;
};
};

const AZURE_OPENAI_API_VERSION = '2023-05-15';
Expand Down Expand Up @@ -53,6 +58,14 @@ export default fp(
await refreshOpenAiToken();
return embeddingsClient.embeddings;
},
async getApiToken() {
await refreshOpenAiToken();
return openAiToken.token;
},
config: {
apiVersion: AZURE_OPENAI_API_VERSION,
apiUrl: openAiUrl,
},
});
},
{
Expand All @@ -64,6 +77,6 @@ export default fp(
// When using .decorate you have to specify added properties for Typescript
declare module 'fastify' {
export interface FastifyInstance {
openai: OpenAiClients;
openai: OpenAiService;
}
}

0 comments on commit f23b342

Please sign in to comment.