feat: add HackerNewsClient; bump deps

pull/659/head
Travis Fischer 2024-06-30 23:12:49 -07:00
rodzic 555f9d54f8
commit 98f7e6dab3
5 zmienionych plików z 839 dodań i 718 usunięć

Wyświetl plik

@ -101,24 +101,24 @@
"zod-to-json-schema": "^3.23.1"
},
"devDependencies": {
"@aws-sdk/client-sso-oidc": "^3.600.0",
"@aws-sdk/client-sso-oidc": "^3.606.0",
"@browserbasehq/sdk": "^1.4.2",
"@dexaai/dexter": "^2.0.3",
"@e2b/code-interpreter": "^0.0.8",
"@fisch0920/eslint-config": "^1.3.3",
"@genkit-ai/ai": "^0.5.3",
"@langchain/core": "^0.2.10",
"@nangohq/node": "^0.40.6",
"@genkit-ai/ai": "^0.5.4",
"@langchain/core": "^0.2.11",
"@nangohq/node": "^0.40.7",
"@total-typescript/ts-reset": "^0.5.1",
"@types/node": "^20.14.9",
"ai": "^3.2.11",
"ai": "^3.2.15",
"del-cli": "^5.1.0",
"dotenv": "^16.4.5",
"eslint": "^8.57.0",
"husky": "^9.0.11",
"lint-staged": "^15.2.7",
"llamaindex": "^0.4.6",
"mathjs": "^13.0.0",
"mathjs": "^13.0.1",
"np": "^10.0.6",
"npm-run-all2": "^6.2.0",
"only-allow": "^1.2.1",
@ -127,7 +127,7 @@
"restore-cursor": "^5.0.0",
"ts-node": "^10.9.2",
"tsup": "^8.1.0",
"tsx": "^4.15.7",
"tsx": "^4.16.0",
"twitter-api-sdk": "^1.2.1",
"typescript": "^5.5.2",
"vitest": "2.0.0-beta.3"

Plik diff jest za duży Load Diff

Wyświetl plik

@ -138,6 +138,7 @@ Depending on the AI SDK and tool you want to use, you'll also need to install th
| [E2B](https://e2b.dev) | `e2b` | Hosted Python code intrepreter sandbox which is really useful for data analysis, flexible code execution, and advanced reasoning on-the-fly. |
| [Exa](https://docs.exa.ai) | `ExaClient` | Web search tailored for LLMs. |
| [Firecrawl](https://www.firecrawl.dev) | `FirecrawlClient` | Website scraping and sanitization. |
| [HackerNews](https://github.com/HackerNews/API) | `HackerNewsClient` | Official HackerNews API. |
| [Hunter](https://hunter.io) | `HunterClient` | Email finder, verifier, and enrichment. |
| [Midjourney](https://www.imagineapi.dev) | `MidjourneyClient` | Unofficial Midjourney client for generative images. |
| [Novu](https://novu.co) | `NovuClient` | Sending notifications (email, SMS, in-app, push, etc). |

Wyświetl plik

@ -0,0 +1,92 @@
import defaultKy, { type KyInstance } from 'ky'
import { AIFunctionsProvider } from '../fns.js'
import { assert, getEnv } from '../utils.js'
export namespace hackernews {
export type ItemType =
| 'story'
| 'comment'
| 'ask'
| 'job'
| 'poll'
| 'pollopt'
export interface Item {
id: number
type: ItemType
by: string
time: number
score: number
title?: string
url?: string
text?: string
descendants?: number
parent?: number
kids?: number[]
parts?: number[]
}
export interface User {
id: string
created: number
about: string
karma: number
submitted: number[]
}
}
/**
* Basic client for the official Hacker News API.
*
* Note that the [HN Algolia API](https://hn.algolia.com/api) seems to no
* longer be available, so we can't add search without quite a bit of overhead.
*
* @see https://github.com/HackerNews/API
*/
export class HackerNewsClient extends AIFunctionsProvider {
protected readonly ky: KyInstance
protected readonly apiBaseUrl: string
protected readonly apiUserAgent: string
constructor({
apiBaseUrl = getEnv('HACKER_NEWS_API_BASE_URL') ??
'https://hacker-news.firebaseio.com',
apiUserAgent = getEnv('HACKER_NEWS_API_USER_AGENT') ??
'Agentic (https://github.com/transitive-bullshit/agentic)',
ky = defaultKy
}: {
apiBaseUrl?: string
apiUserAgent?: string
ky?: KyInstance
} = {}) {
assert(apiBaseUrl, 'HackerNewsClient missing required "apiBaseUrl"')
super()
this.apiBaseUrl = apiBaseUrl
this.apiUserAgent = apiUserAgent
this.ky = ky.extend({
prefixUrl: apiBaseUrl,
headers: {
'user-agent': apiUserAgent
}
})
}
async getItem(id: string | number) {
return this.ky.get(`v0/item/${id}.json`).json<hackernews.Item>()
}
async getTopStories() {
return this.ky.get('v0/topstories.json').json<number[]>()
}
async getNewStories() {
return this.ky.get('v0/newstories.json').json<number[]>()
}
async getBestStories() {
return this.ky.get('v0/beststories.json').json<number[]>()
}
}

Wyświetl plik

@ -4,6 +4,7 @@ export * from './dexa-client.js'
export * from './diffbot-client.js'
export * from './exa-client.js'
export * from './firecrawl-client.js'
export * from './hacker-news-client.js'
export * from './hunter-client.js'
export * from './midjourney-client.js'
export * from './novu-client.js'