Node.js client for the unofficial ChatGPT API.
Go to file
Travis Fischer 52fe2db156 2024-06-04 06:30:36 -05:00
.github 🚕 2024-06-03 17:24:58 -05:00
.husky init 2024-05-16 18:22:07 -07:00
bin 👿 2024-06-03 15:06:41 -05:00
examples 💂 2024-06-03 17:09:28 -05:00
media 2024-06-04 06:30:36 -05:00
src 🏐 2024-06-03 17:23:56 -05:00
.editorconfig init 2024-05-16 18:22:07 -07:00
.env.example 🏡 2024-06-01 19:34:25 -05:00
.eslintrc.json 👿 2024-06-03 15:06:41 -05:00
.gitignore 😻 2024-06-03 03:46:05 -05:00
.npmrc init 2024-05-16 18:22:07 -07:00
.prettierrc init 2024-05-16 18:22:07 -07:00
json-schema.json 📒 2024-05-22 03:11:36 -05:00
license 2024-06-04 06:30:36 -05:00
package.json 👿 2024-06-03 15:06:41 -05:00
pnpm-lock.yaml 👿 2024-06-03 15:06:41 -05:00
pnpm-workspace.yaml 🤙 2024-06-01 21:04:13 -05:00
readme.md 2024-06-04 06:30:36 -05:00
tsconfig.json feat: add openai example 2024-06-02 17:30:39 -05:00
tsup.config.ts feat: add genkit 2024-06-02 02:30:50 -05:00
vite.config.ts 🏡 2024-06-01 19:34:25 -05:00

readme.md

Agentic

AI agent stdlib that works with any AI SDK and LLM

Build Status NPM MIT License Prettier Code Formatting

Agentic

[!WARNING]
TODO: this project is not published yet and is an active WIP.

The goal of this project is to create a set of standard AI functions / tools which are optimized for both normal TS-usage as well as LLM-based usage across any popular AI SDK via simple adaptors.

For example, all of the stdlib tools like WeatherClient can be used both as normal, fully-typed TS SDKs:

import { WeatherClient } from '@agentic/stdlib'

const weather = new WeatherClient() // (requires `WEATHER_API_KEY` env var)

const result = await clearbit.getCurrentWeather({
  q: 'San Francisco'
})

console.log(result)

Or you can use them as a set of LLM-based functions / tools using adaptors specific to each LLM SDK. This example uses Vercel's AI SDK:

// sdk-specific imports
import { openai } from '@ai-sdk/openai'
import { generateText } from 'ai'
import { createAISDKTools } from '@agentic/stdlib/ai-sdk'

// sdk-agnostic imports
import { WeatherClient } from '@agentic/stdlib'

const weather = new WeatherClient()

const result = await generateText({
  model: openai('gpt-4o'),
  tools: createAISDKTools(weather),
  toolChoice: 'required',
  prompt: 'What is the weather in San Francisco?'
})

console.log(result.toolResults[0])

Let's take a slightly more complicated example which uses multiple clients and selects a subset of their functions using the pick method:

// sdk-specific imports
import { ChatModel, createAIRunner } from '@dexaai/dexter'
import { createDexterFunctions } from '@agentic/stdlib/dexter'

// sdk-agnostic imports
import { PerigonClient, SerperClient } from '@agentic/stdlib'

async function main() {
  const perigon = new PerigonClient()
  const serper = new SerperClient()

  const runner = createAIRunner({
    chatModel: new ChatModel({
      params: { model: 'gpt-4o', temperature: 0 }
    }),
    functions: createDexterFunctions(
      perigon.functions.pick('search_news_stories'),
      serper
    ),
    systemMessage:
      'You are a helpful assistant. Be as concise as possible. Respond in markdown. Always cite your sources.'
  })

  const result = await runner(
    'Summarize the latest news stories about the upcoming US election.'
  )
  console.log(result)
}

Here we've exposed 2 functions to the LLM, search_news_stories which corresponds to the PerigonClient.searchStories method and serper_google_search via the SerperClient.search method.

All of the SDK adaptors like createDexterFunctions are very flexible in what they accept. AIFunctionLike objects include:

  • AIFunctionSet - Sets of AI functions (like perigon.functions.pick('search_news_stories') or perigon.functions or serper.functions)
  • AIFunctionsProvider - Client classes which expose an AIFunctionSet via the .functions property (like perigon or serper)
  • AIFunction - Individual functions (like perigon.functions.get('search_news_stories') or serper.functions.get('serper_google_search'))

You can pass as many or as few of these AIFunctionLike objects as you'd like and you can manipulate them as AIFunctionSet objects via .pick, .omit, .get, .map, etc.

The SDK-specific imports are all isolated to keep the main @agentic/stdlib as lightweight as possible.

Client Goals

  • clients should be as minimal as possible
  • clients must use ky as a lightweight native fetch wrapper
  • clients must have a strongly-typed TS DX
  • clients should expose select methods via the @aiFunction(...) decorator
    • @aiFunction methods must use zod for input schema validation
  • it should be easy to create external clients which follow the AIFunctionsProvider superclass / @aiFunction decorator pattern
  • common utility functions for LLM-based function calling should be exported for convenience
  • clients and AIFunctions should be composable via AIFunctionSet
  • clients must work with all major TS AI SDKs
    • SDK adaptors should be as lightweight as possible and be optional peer dependencies of @agentic/core
    • SDK adatptor entrypoints should all be isolated to their own top-level imports
      • @agentic/core/ai-sdk
      • @agentic/core/dexter
      • @agentic/core/genkit
      • @agentic/core/langchain

Services

  • clearbit
  • dexa
  • diffbot
  • exa
  • firecrawl (WIP)
  • people data labs (WIP)
  • perigon
  • predict leads
  • proxycurl
  • scraper
  • searxng
  • serpapi
  • serper
  • twitter (WIP)
  • weatherapi
  • wikipedia

AI SDKs

  • vercel ai sdk
  • dexa dexter
  • firebase genkit
  • langchain

TODO

  • rename this repo to agentic
  • change license to MIT
  • sdks
    • instructor-js
    • TODO
  • services
    • calculator
    • e2b
    • search-and-scrape
    • replicate
    • huggingface
    • wolfram alpha
    • midjourney
    • unstructured
    • pull from langchain
      • provide a converter for langchain DynamicStructuredTool
    • pull from other libs
    • pull from nango
  • tools / chains / flows / runnables
    • market maps
  • https://github.com/causaly/zod-validation-error

License

MIT © Travis Fischer

To stay up to date or learn more, follow @transitive_bs on Twitter.