-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
typescript openai plugin refactor (#24)
* first pass openai plugin refactor * add yml file for action to test typescript openai * add starpoint as a package and not use relative path * update npm package version for starpoint sdk
- Loading branch information
Showing
13 changed files
with
6,964 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
name: Typescript OpenAI Tests | ||
|
||
on: | ||
pull_request: | ||
branches: | ||
- main | ||
|
||
concurrency: | ||
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
test-typescript-sdk: | ||
name: Typescript OpenAI SDK Tests | ||
runs-on: ubuntu-latest | ||
defaults: | ||
run: | ||
working-directory: ./typescript-openai | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/setup-node@v3 | ||
with: | ||
node-version: "16.x" | ||
- run: npm install | ||
- run: npm test |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
/** @type {import('ts-jest').JestConfigWithTsJest} */ | ||
module.exports = { | ||
preset: 'ts-jest', | ||
testEnvironment: 'node', | ||
}; |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
{ | ||
"name": "starpoint-openai", | ||
"author": "pointable <package-maintainers@pointable.ai>", | ||
"version": "0.1.0", | ||
"description": "TypeScript OpenAI API for starpoint.ai", | ||
"source": "src/index.ts", | ||
"main": "dist/main.js", | ||
"types": "dist/types.d.ts", | ||
"module": "dist/module.js", | ||
"devDependencies": { | ||
"@parcel/packager-ts": "^2.8.3", | ||
"@parcel/transformer-typescript-types": "^2.8.3", | ||
"@types/jest": "^29.5.3", | ||
"@types/node": "^20.4.2", | ||
"@types/validator": "^13.7.17", | ||
"jest": "^29.6.1", | ||
"parcel": "^2.8.3", | ||
"ts-jest": "^29.1.1", | ||
"typescript": "^5.0.4", | ||
"uuid": "^9.0.0" | ||
}, | ||
"scripts": { | ||
"dev": "parcel watch", | ||
"build": "parcel build", | ||
"test": "jest" | ||
}, | ||
"dependencies": { | ||
"axios": "^1.3.5", | ||
"openai": "^3.3.0", | ||
"starpoint": "^0.3.2", | ||
"validator": "^13.9.0" | ||
} | ||
} |
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,168 @@ | ||
import axios, { AxiosResponse } from "axios"; | ||
import { v4 as uuid4 } from "uuid"; | ||
import { db } from "../../typescript/src"; | ||
import { starpointOpenai } from "../src"; | ||
import { OpenAIApi } from "openai"; | ||
import { create } from "domain"; | ||
import { BuildAndInsertEmbeddingsFromOpenAIRequest } from "../src/types"; | ||
|
||
// Mock Axios | ||
jest.mock("axios"); | ||
const mockedAxios = axios as jest.Mocked<typeof axios>; | ||
|
||
// Mock OpenAI | ||
jest.mock("openai"); | ||
const createEmbeddingSpy = jest.spyOn(OpenAIApi.prototype, "createEmbedding"); | ||
|
||
// Mock starpoint initialized objects | ||
const starpointDbSpy = jest.spyOn(db, "initialize"); | ||
starpointDbSpy.mockReturnValue({ | ||
inferSchema: jest.fn(), | ||
columnInsert: jest.fn(), | ||
insertDocuments: jest.fn(), | ||
deleteDocuments: jest.fn(), | ||
updateDocuments: jest.fn(), | ||
createCollection: jest.fn(), | ||
deleteCollection: jest.fn(), | ||
embed: jest.fn(), | ||
queryDocuments: jest.fn(), | ||
}); | ||
const starpointOpenAiClientSpy = jest.spyOn(starpointOpenai, "initialize"); | ||
|
||
beforeAll(() => { | ||
mockedAxios.create.mockReturnThis(); | ||
}); | ||
|
||
afterEach(() => { | ||
mockedAxios.delete.mockClear(); | ||
mockedAxios.put.mockClear(); | ||
mockedAxios.patch.mockClear(); | ||
mockedAxios.get.mockClear(); | ||
mockedAxios.post.mockClear(); | ||
starpointDbSpy.mockClear(); | ||
starpointOpenAiClientSpy.mockClear(); | ||
createEmbeddingSpy.mockReset(); | ||
}); | ||
|
||
describe("starpointOpenAi.initialize", () => { | ||
it("should correctly set openAIKey and starpointAi and default urls", () => { | ||
const MOCK_OPENAI_KEY = uuid4(); | ||
const MOCK_API_KEY = uuid4(); | ||
const dbClient = db.initialize(MOCK_API_KEY); | ||
expect(starpointDbSpy).toHaveBeenCalled(); | ||
expect(starpointDbSpy).toHaveBeenCalledWith(MOCK_API_KEY); | ||
starpointOpenai.initialize(MOCK_OPENAI_KEY, dbClient); | ||
expect(starpointOpenAiClientSpy).toHaveBeenCalled(); | ||
expect(starpointOpenAiClientSpy).toHaveBeenCalledWith( | ||
MOCK_OPENAI_KEY, | ||
dbClient | ||
); | ||
}); | ||
}); | ||
|
||
describe("buildAndInsertEmbeddings", () => { | ||
it("should return an openai response, but not a starpoint response", async () => { | ||
const MOCK_COLLECTION_ID = uuid4(); | ||
const MOCK_API_KEY = uuid4(); | ||
const mockInitializeClient = starpointDbSpy.getMockImplementation(); | ||
const dbClient = mockInitializeClient(MOCK_API_KEY); | ||
const MOCK_OPENAI_KEY = uuid4(); | ||
const mockRequest = { | ||
collection_id: MOCK_COLLECTION_ID, | ||
input_data: "this is test input", | ||
}; | ||
const starpointOpenAiClient = starpointOpenai.initialize( | ||
MOCK_OPENAI_KEY, | ||
dbClient | ||
); | ||
const columnInsertSpy = jest.spyOn(dbClient, "columnInsert"); | ||
|
||
await starpointOpenAiClient.buildAndInsertEmbeddings(mockRequest); | ||
// check that mock returned an openai response | ||
expect(createEmbeddingSpy).toHaveBeenCalled(); | ||
|
||
// check that starpoint column insert is not called; | ||
expect(columnInsertSpy).not.toHaveBeenCalled(); | ||
}); | ||
it("should return both an openai response and a starpoint response", async () => { | ||
const MOCK_COLLECTION_ID = uuid4(); | ||
const MOCK_API_KEY = uuid4(); | ||
const mockInitializeClient = starpointDbSpy.getMockImplementation(); | ||
const dbClient = mockInitializeClient(MOCK_API_KEY); | ||
const MOCK_OPENAI_KEY = uuid4(); | ||
const mockRequest = { | ||
collection_id: MOCK_COLLECTION_ID, | ||
input_data: "this is test input", | ||
}; | ||
const starpointOpenAiClient = starpointOpenai.initialize( | ||
MOCK_OPENAI_KEY, | ||
dbClient | ||
); | ||
|
||
const mockCreateEmbeddingResponse = { | ||
data: { | ||
object: "mock", | ||
model: "text-embedding-ada-002", | ||
usage: { prompt_tokens: 0, total_tokens: 0 }, | ||
data: [ | ||
{ index: 1, embedding: [0.1, 0.2, 0.3], object: "mock" }, | ||
{ index: 2, embedding: [0.4, 0.5, 0.6], object: "mock" }, | ||
], | ||
}, | ||
status: 200, | ||
statusText: "ok", | ||
headers: null, | ||
config: null, | ||
}; | ||
const mockColumnInsertResponse = { | ||
data: { | ||
collection_id: MOCK_COLLECTION_ID, | ||
documents: [], | ||
}, | ||
error: null, | ||
}; | ||
const columnInsertSpy = jest.spyOn(dbClient, "columnInsert"); | ||
|
||
createEmbeddingSpy.mockResolvedValue(mockCreateEmbeddingResponse); | ||
columnInsertSpy.mockResolvedValue(mockColumnInsertResponse); | ||
await starpointOpenAiClient.buildAndInsertEmbeddings(mockRequest); | ||
// check that mock returned an openai response | ||
expect(createEmbeddingSpy).toHaveBeenCalled(); | ||
|
||
// check that starpoint column insert is called; | ||
expect(columnInsertSpy).toHaveBeenCalled(); | ||
|
||
columnInsertSpy.mockReset(); | ||
}); | ||
}); | ||
|
||
describe("buildAndInsertEmbeddingsNoDefault", () => { | ||
it("should return only an openai response and not a starpoint response", async () => { | ||
const MOCK_COLLECTION_ID = uuid4(); | ||
const MOCK_API_KEY = uuid4(); | ||
const mockInitializeClient = starpointDbSpy.getMockImplementation(); | ||
const dbClient = mockInitializeClient(MOCK_API_KEY); | ||
const MOCK_OPENAI_KEY = uuid4(); | ||
const mockRequest: BuildAndInsertEmbeddingsFromOpenAIRequest = { | ||
collection_id: MOCK_COLLECTION_ID, | ||
model: "text-image-ada-002", | ||
input_data: "this is test input", | ||
document_metadata: [{ car: 2 }, { car: 1 }], | ||
}; | ||
const starpointOpenAiClient = starpointOpenai.initialize( | ||
MOCK_OPENAI_KEY, | ||
dbClient | ||
); | ||
const columnInsertSpy = jest.spyOn(dbClient, "columnInsert"); | ||
|
||
await starpointOpenAiClient.buildAndInsertEmbeddingsNoDefault(mockRequest); | ||
// check that mock returned an openai response | ||
expect(createEmbeddingSpy).toHaveBeenCalled(); | ||
|
||
// check that starpoint column insert is not called; | ||
expect(columnInsertSpy).not.toHaveBeenCalled(); | ||
|
||
columnInsertSpy.mockReset(); | ||
createEmbeddingSpy.mockReset(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"compilerOptions": { | ||
"target": "ES5", | ||
"lib": ["ES2015"], | ||
"esModuleInterop": true | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.