Skip to content

Commit

Permalink
feat: experimental pdf support
Browse files Browse the repository at this point in the history
We are using the [Google Vertex AI API](https://cloud.google.com/vertex-ai/docs/reference/rest).
  • Loading branch information
aalemayhu committed Oct 20, 2024
1 parent 35d591b commit 7374194
Show file tree
Hide file tree
Showing 13 changed files with 356 additions and 72 deletions.
146 changes: 142 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
"license": "MIT",
"dependencies": {
"@2anki/csv-to-apkg": "^1.4.4",
"@google-cloud/vertexai": "^1.9.0",
"@notionhq/client": "^2.2.13",
"@sendgrid/mail": "^8.1.3",
"aws-sdk": "^2.1502.0",
Expand Down
113 changes: 58 additions & 55 deletions src/controllers/SettingsController/SettingsController.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import SettingsService, { IServiceSettings } from '../../services/SettingsService';
import SettingsService, {
IServiceSettings,
} from '../../services/SettingsService';
import SettingsController from './SettingsController';
import { SettingsInitializer } from '../../data_layer/public/Settings';

Expand All @@ -7,69 +9,70 @@ class FakeSettingsService implements IServiceSettings {
return Promise.resolve([]);
}
delete(owner: string, id: string): Promise<void> {
return Promise.resolve()
return Promise.resolve();
}

getById(id: string): Promise<SettingsInitializer> {
return Promise.resolve({
object_id: "1",
owner: "1",
payload: "payload"
})
object_id: '1',
owner: '1',
payload: 'payload',
});
}
}

describe("SettingsController", () => {

test("returns default settings for client", () => {
const settingsController = new SettingsController(new FakeSettingsService());
const defaultOptions = settingsController.getDefaultSettingsCardOptions('client');

expect(defaultOptions).toStrictEqual(
{
"add-notion-link": "false",
"use-notion-id": "true",
"all": "true",
"paragraph": "false",
"cherry": "false",
"avocado": "false",
"tags": "false",
"cloze": "true",
"markdown-nested-bullet-points": "false",
"enable-input": "false",
"basic-reversed": "false",
"reversed": "false",
"no-underline": "false",
"max-one-toggle-per-card": "true",
"remove-mp3-links": "true",
"perserve-newlines": "true"
}
describe('SettingsController', () => {
test('returns default settings for client', () => {
const settingsController = new SettingsController(
new FakeSettingsService()
);
})
const defaultOptions =
settingsController.getDefaultSettingsCardOptions('client');

test("returns default settings for server", () => {
const settingsController = new SettingsController(new FakeSettingsService());
const defaultOptions = settingsController.getDefaultSettingsCardOptions('server');
expect(defaultOptions).toStrictEqual({
'add-notion-link': 'false',
'use-notion-id': 'true',
all: 'true',
paragraph: 'false',
cherry: 'false',
avocado: 'false',
tags: 'false',
cloze: 'true',
'markdown-nested-bullet-points': 'false',
'enable-input': 'false',
'basic-reversed': 'false',
reversed: 'false',
'no-underline': 'false',
'max-one-toggle-per-card': 'true',
'remove-mp3-links': 'true',
'perserve-newlines': 'true',
'vertex-ai-pdf-questions': 'false',
});
});

expect(defaultOptions).toStrictEqual(
{
'add-notion-link': 'false',
'use-notion-id': 'true',
"all": 'true',
"paragraph": 'false',
"cherry": 'false',
"avocado": 'false',
"tags": 'true',
"cloze": 'true',
'enable-input': 'false',
'basic-reversed': 'false',
"reversed": 'false',
'no-underline': 'false',
'max-one-toggle-per-card': 'true',
'perserve-newlines': 'false',
'page-emoji': 'first-emoji',
}
test('returns default settings for server', () => {
const settingsController = new SettingsController(
new FakeSettingsService()
);
})
const defaultOptions =
settingsController.getDefaultSettingsCardOptions('server');

})
expect(defaultOptions).toStrictEqual({
'add-notion-link': 'false',
'use-notion-id': 'true',
all: 'true',
paragraph: 'false',
cherry: 'false',
avocado: 'false',
tags: 'true',
cloze: 'true',
'enable-input': 'false',
'basic-reversed': 'false',
reversed: 'false',
'no-underline': 'false',
'max-one-toggle-per-card': 'true',
'perserve-newlines': 'false',
'page-emoji': 'first-emoji',
});
});
});
6 changes: 6 additions & 0 deletions src/controllers/SettingsController/supportedOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,12 @@ const supportedOptions = (): CardOption[] => {
'Enable conversion of bullet and sub bullet points in Markdown. If you are a Obsidian user, enable this',
false
),
new CardOption(
'vertex-ai-pdf-questions',
'Generate Questions from Single PDF File Uploads',
'Use Vertex AI API to generate questions from PDFs. This is a paid feature and if enabled will send your notes to Google Cloud.',
false
),
];

return v.filter(Boolean);
Expand Down
10 changes: 9 additions & 1 deletion src/lib/anki/zip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { strFromU8, unzipSync } from 'fflate';
import { Body } from 'aws-sdk/clients/s3';
import { renderToStaticMarkup } from 'react-dom/server';
import { getUploadLimits } from '../misc/getUploadLimits';
import { isHTMLFile, isMarkdownFile } from '../storage/checks';
import { isHTMLFile, isMarkdownFile, isPDFFile } from '../storage/checks';

interface File {
name: string;
Expand Down Expand Up @@ -46,6 +46,14 @@ class ZipHandler {
for (const name of this.fileNames) {
const file = loadedZip[name];
let contents = file;

/**
* For now disable batch processing of PDF files. We only want single uploads to avoid creating too many requests.
*/
if (name.includes('__MACOSX/') || isPDFFile(name)) {
continue;
}

if ((isHTMLFile(name) || isMarkdownFile(name)) && contents) {
this.files.push({ name, contents: strFromU8(file) });
} else if (contents) {
Expand Down
Loading

0 comments on commit 7374194

Please sign in to comment.