Streaming AI chat with versioned prompts, tool calling and usage/cost logging; model set by env
Code0 filesContext~668 tokensscan passed
Install
$
genpm add @core/aiWhat you get
- Source in src/lib/ai/, 0 files.
- AI rules in src/lib/ai/AGENTS.md, plus IDE rule files.
- Env vars added to .env.example: AI_MODEL, AI_PROVIDER_API_KEY.
- Resolves @core/db for you.
README
This package has no README.
~668 tokens→ src/lib/ai/AGENTS.md→ .cursor/rules/genpm-core-ai.mdc
This is exactly what your AI reads when it works in src/lib/ai. Nothing else is added to its context.
@core/ai — rules for AI agents
Purpose
Streaming chat endpoint on the Vercel AI SDK, with versioned system prompts, a tool-calling scaffold and per-response
usage logging (tokens and cost) in the database. Provider and model come from env: nothing is hardcoded. No RAG,
embeddings or chat history storage (store UIMessage[] yourself if you need it).
Map
index.ts— public API:streamChat,getModel,setModel,recordUsage,prompts,tools,PRICES.prompts.ts— your config: system prompts withversion. Bumpversionwhenever you change a prompt.tools.ts— your config: tools the model can call (zodinputSchema+ server-sideexecute).prices.ts— your config: USD per million tokens perAI_MODEL, for cost logging.schema.ts—ai_usagetable. Depends on../db(@core/db).adapters/hono.ts,adapters/next.ts—POST /ai/chatreturning a UI message stream foruseChat.
Integration
- Requires Node 22+ (AI SDK 7). Env:
AI_MODELas<provider>:<model-id>plusAI_PROVIDER_API_KEY, and install that provider package:anthropic→@ai-sdk/anthropic,openai→@ai-sdk/openai, alsogoogle,mistral,groq,xai. OrAI_MODEL=<provider>/<model-id>withAI_GATEWAY_API_KEY(Vercel AI Gateway, no extra package). Ask the user which provider and model to use; do not pick one for them. - Generate and apply migrations (see
src/lib/db/AGENTS.md). - Hono:
app.route('/ai', aiRoutes({ getUserId: (c) => c.get('user')?.id, requireUser: true }))after@core/auth'ssessionMiddleware(omit both options without auth). Next.js:app/api/ai/chat/route.ts→export const POST = chatRoute({ getUserId, requireUser: true }). Delete the adapter of the framework you don't use. - Frontend:
useChat({ transport: new DefaultChatTransport({ api: '/ai/chat' }) })from@ai-sdk/react. - Verify:
curl -N -X POST localhost:3000/ai/chat -H 'content-type: application/json' -d '{"messages":[{"id":"1","role":"user","parts":[{"type":"text","text":"hi"}]}]}'.
Conventions
- One prompt per use case in
prompts.ts; pass it withstreamChat({ prompt: 'assistant', … }). - Tools authorize inside
executeusing the user id; never trust ids sent by the model. - Query
ai_usagefor quotas (e.g. tokens per user per day) before callingstreamChat. - Tests:
setModel(new MockLanguageModelV4(...))fromai/test.
Don't
- Don't hardcode a model or API key, and don't call the provider from the browser.
- Don't log prompts or completions with user data in production.
- Don't let tools run destructive actions without an explicit user confirmation step.
# @core/ai — rules for AI agents
## Purpose
Streaming chat endpoint on the Vercel AI SDK, with versioned system prompts, a tool-calling scaffold and per-response
usage logging (tokens and cost) in the database. Provider and model come from env: nothing is hardcoded. No RAG,
embeddings or chat history storage (store `UIMessage[]` yourself if you need it).
## Map
- `index.ts` — public API: `streamChat`, `getModel`, `setModel`, `recordUsage`, `prompts`, `tools`, `PRICES`.
- `prompts.ts` — **your config**: system prompts with `version`. Bump `version` whenever you change a prompt.
- `tools.ts` — **your config**: tools the model can call (zod `inputSchema` + server-side `execute`).
- `prices.ts` — **your config**: USD per million tokens per `AI_MODEL`, for cost logging.
- `schema.ts` — `ai_usage` table. Depends on `../db` (@core/db).
- `adapters/hono.ts`, `adapters/next.ts` — `POST /ai/chat` returning a UI message stream for `useChat`.
## Integration
1. Requires Node 22+ (AI SDK 7). Env: `AI_MODEL` as `<provider>:<model-id>` plus `AI_PROVIDER_API_KEY`, and install
that provider package: `anthropic` → `@ai-sdk/anthropic`, `openai` → `@ai-sdk/openai`, also `google`, `mistral`,
`groq`, `xai`. Or `AI_MODEL=<provider>/<model-id>` with `AI_GATEWAY_API_KEY` (Vercel AI Gateway, no extra package).
Ask the user which provider and model to use; do not pick one for them.
2. Generate and apply migrations (see `src/lib/db/AGENTS.md`).
3. Hono: `app.route('/ai', aiRoutes({ getUserId: (c) => c.get('user')?.id, requireUser: true }))` after
`@core/auth`'s `sessionMiddleware` (omit both options without auth).
Next.js: `app/api/ai/chat/route.ts` → `export const POST = chatRoute({ getUserId, requireUser: true })`.
Delete the adapter of the framework you don't use.
4. Frontend: `useChat({ transport: new DefaultChatTransport({ api: '/ai/chat' }) })` from `@ai-sdk/react`.
5. Verify: `curl -N -X POST localhost:3000/ai/chat -H 'content-type: application/json' -d '{"messages":[{"id":"1","role":"user","parts":[{"type":"text","text":"hi"}]}]}'`.
## Conventions
- One prompt per use case in `prompts.ts`; pass it with `streamChat({ prompt: 'assistant', … })`.
- Tools authorize inside `execute` using the user id; never trust ids sent by the model.
- Query `ai_usage` for quotas (e.g. tokens per user per day) before calling `streamChat`.
- Tests: `setModel(new MockLanguageModelV4(...))` from `ai/test`.
## Don't
- Don't hardcode a model or API key, and don't call the provider from the browser.
- Don't log prompts or completions with user data in production.
- Don't let tools run destructive actions without an explicit user confirmation step.
The exact tree that will be injected, after .genpmignore. Pinned to
Source temporarily unavailable. Metadata is still accurate.
This package declares no MCP servers.
| Version | Commit | Published | Scan |
|---|---|---|---|
| 1.0.0 | 5b1e62b | 3 hours ago | ✔ scan passed |
- genpm
- @core/db ^1.0.0
- proposed
- GenPM proposes the npm command and runs it only if you say yes.
- scan
- scan passed · 0 findings
- commit
- v1.0.0 → 5b1e62b6abcfd9ec65065b64fb87aad6d3a6b23f · verified after fetch
- scripts
- None. GenPM never runs package code.
- license
- MIT
- report
- See something wrong?