@nosocial/ai-sdk
v0.1.0
Published
NoSocial reputation reporting for Vercel AI SDK — auto-reports model interactions to the NoSocial oracle
Maintainers
Readme
@nosocial/ai-sdk
NoSocial reputation reporting for the Vercel AI SDK. Wrap any language model with one middleware — interactions are reported automatically.
Install
npm install @nosocial/ai-sdkUsage
import { nosocialMiddleware } from "@nosocial/ai-sdk";
import { wrapLanguageModel, generateText, streamText } from "ai";
import { openai } from "@ai-sdk/openai";
// Wrap your model with NoSocial middleware
const model = wrapLanguageModel({
model: openai("gpt-4o"),
middleware: nosocialMiddleware({
oracleUrl: "https://api.nosocial.me",
agentName: "my-assistant",
}),
});
// Use the model as normal — reports are sent automatically
const result = await generateText({ model, prompt: "Explain quantum computing" });
// Streaming works too
const stream = await streamText({ model, prompt: "Write a haiku" });What it does
Every model call is automatically reported to the NoSocial oracle:
| Event | Domain | Score |
|---|---|---|
| Successful generation | task_completion | 0.8 |
| Generation with tool calls | collaboration | 0.7 per tool |
| Generation error | reliability | -0.5 |
| Stream completion | task_completion | 0.8 |
Reports are fire-and-forget — they never block model responses.
Identity mapping
- Reporter: Your application, identified by
agentName - Subject: The model being called, namespaced under your agent (e.g.,
my-assistant:openai:gpt-4o)
Each identity gets a persistent Ed25519 keypair stored in .nosocial/keys/. The same {agentName, modelId} combination gets the same DID across runs.
Configuration
nosocialMiddleware({
oracleUrl: "https://api.nosocial.me", // Oracle endpoint
agentName: "my-assistant", // Your application's identity
keysDir: ".nosocial/keys", // Where to store keypairs
autoRegister: true, // Auto-register with oracle
onError: (err) => console.error(err), // Error callback (fire-and-forget)
})Works with any provider
The middleware wraps the AI SDK's LanguageModelV1 interface, so it works with any provider:
import { anthropic } from "@ai-sdk/anthropic";
import { google } from "@ai-sdk/google";
// Anthropic
const claude = wrapLanguageModel({
model: anthropic("claude-sonnet-4-5-20250514"),
middleware: nosocialMiddleware({ agentName: "my-app" }),
});
// Google
const gemini = wrapLanguageModel({
model: google("gemini-2.0-flash"),
middleware: nosocialMiddleware({ agentName: "my-app" }),
});Key storage
Agent keypairs are stored as raw key files in .nosocial/keys/ with 0600 permissions. Add this to your .gitignore:
.nosocial/License
MIT
