LangChain Agent Fundamentals
langchain-ai/langchain-skills
Shows how to build LangChain agents with create_agent, define tools, add a checkpointer and use middleware for human approval and error handling, in Python and TypeScript.
Guides building and deploying TypeScript agents on the OpenServ platform, with runnable and runless capabilities, wallet-based sign-up and a local tunnel for development.
$ npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install internet-court/internet-court-skill openserv-agent-sdk --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/internet-court/internet-court-skill.git skills-src && mkdir -p .claude/skills && cp -r skills-src/vendored/openserv/openserv-agent-sdk .claude/skills/openserv-agent-sdk && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "openserv-agent-sdk" agent skill from https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdk into .claude/skills/openserv-agent-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openserv-agent-sdk", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdkType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install internet-court/internet-court-skill openserv-agent-sdk --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/internet-court/internet-court-skill.git skills-src && mkdir -p .agents/skills && cp -r skills-src/vendored/openserv/openserv-agent-sdk .agents/skills/openserv-agent-sdk && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "openserv-agent-sdk" agent skill from https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdk into .agents/skills/openserv-agent-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openserv-agent-sdk", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install internet-court/internet-court-skill openserv-agent-sdk --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/internet-court/internet-court-skill.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/vendored/openserv/openserv-agent-sdk .cursor/skills/openserv-agent-sdk && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "openserv-agent-sdk" agent skill from https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdk into .cursor/skills/openserv-agent-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openserv-agent-sdk", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/internet-court/internet-court-skill.git --path vendored/openserv/openserv-agent-sdk--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install internet-court/internet-court-skill openserv-agent-sdk --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/internet-court/internet-court-skill.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/vendored/openserv/openserv-agent-sdk .gemini/skills/openserv-agent-sdk && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "openserv-agent-sdk" agent skill from https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdk into .gemini/skills/openserv-agent-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openserv-agent-sdk", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install internet-court/internet-court-skill openserv-agent-sdkInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/internet-court/internet-court-skill.git skills-src && mkdir -p .github/skills && cp -r skills-src/vendored/openserv/openserv-agent-sdk .github/skills/openserv-agent-sdk && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "openserv-agent-sdk" agent skill from https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdk into .github/skills/openserv-agent-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openserv-agent-sdk", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install internet-court/internet-court-skill openserv-agent-sdk --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/internet-court/internet-court-skill.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/vendored/openserv/openserv-agent-sdk .opencode/skills/openserv-agent-sdk && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "openserv-agent-sdk" agent skill from https://github.com/internet-court/internet-court-skill/tree/main/vendored/openserv/openserv-agent-sdk into .opencode/skills/openserv-agent-sdk/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openserv-agent-sdk", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
openserv-agent-sdkGuides building and deploying TypeScript agents on the OpenServ platform, with runnable and runless capabilities, wallet-based sign-up and a local tunnel for development.
This skill walks the agent through building a custom agent for the OpenServ platform in TypeScript. You define a system prompt plus capabilities. A runnable capability has a Zod input schema and a run handler. A runless one is only a name and a description, and the platform makes the AI call for you. Inside a runnable capability, generate() hands an LLM call to the platform, or you can bring your own model provider, or use no LLM at all.
To go live, provision() from the companion @openserv-labs/client package creates or reuses a wallet, registers the agent and writes the API key and auth token into your environment. During development the SDK can use a built-in tunnel, so no endpoint URL is needed, and run(agent) starts listening for tasks. The folder ships example agents for error handling, file operations, task management and multiple capabilities, plus reference.md and troubleshooting.md. The skill says its sibling openserv-client skill must be read alongside it.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit fa89195. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (TypeScript), which the agent can run.
Shell commands in SKILL.md call:
npmnpxFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
8004scan.ioFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
WALLET_PRIVATE_KEYOPENSERV_USER_API_KEYOPENAI_API_KEYOPENSERV_API_KEYANTHROPIC_API_KEYOPENSERV_AUTH_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
OpenServ Agent SDK loads about 4.9k tokens when it runs. Until then it costs about 97 tokens; SKILL.md has 1,706 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
├── .env### .env1. **`OPENSERV_USER_API_KEY` in `.env`** — Your `.env` file in the agent directory must contain `OPENSERV_USER_API_KEY`.1. Set OPENSERV_USER_API_KEY in .envort 'dotenv/config'`) so you can reload `.env` after `provision()` writes `WALLET_PRIVATE_KEY`.// Reload .env to pick up WALLET_PRIVATE_KEY written by provision()Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from internet-court/internet-court-skill at commit fa89195, republished under its MIT licence (© internet-court). 1,706 words, ~4,881 tokens.
.claude/skills/openserv-agent-sdk/SKILL.md (or your agent's skills folder). This skill also uses 12 other files; get the full folder from GitHub.Build and deploy custom AI agents for the OpenServ platform using TypeScript.
An OpenServ agent is a service that runs your code and exposes it on the OpenServ platform—so it can be triggered by workflows, other agents, or paid calls (e.g. x402). The platform sends tasks to your agent; your agent runs your capabilities (APIs, tools, file handling) and returns results. You don't have to use an LLM—e.g. it could be a static API that just returns data. If you need LLM reasoning, you have two options: use runless capabilities (the platform handles the AI call for you—no API key needed) or use generate() (delegates the LLM call to the platform); alternatively, bring your own LLM (any provider you have access to).
run handler) and runless (just a name and description—the platform handles the AI call automatically). You can also use generate() inside runnable capabilities to delegate LLM calls to the platform.provision() create one for you automatically by creating a wallet and signing up with it (that account is reused on later runs). Call provision() (from @openserv-labs/client): it creates or reuses a wallet, registers the agent, and writes API key and auth token into your env (or you pass agent.instance to bind them directly). In development you can skip setting an endpoint URL; the SDK can use a built-in tunnel to the platform.run(agent). The agent listens for tasks, runs your capabilities (and your LLM if you use one), and responds. Use reference.md and troubleshooting.md for details; examples/ has full runnable code.run() function needed. Optionally define inputSchema and outputSchema for structured I/O.inputSchema, and run() function.generate() method — Delegate LLM calls to the platform from inside any runnable capability. No API key needed—the platform performs the call and records usage. Supports text and structured output.addLogToTask() and uploadFile().Reference: reference.md (patterns) · troubleshooting.md (common issues) · examples/ (full examples)
npm install @openserv-labs/sdk @openserv-labs/client zodNote:
openaiis only needed if you use theprocess()method for direct OpenAI calls. Most agents don't need it—use runless capabilities orgenerate()instead.
See examples/basic-agent.ts for a complete runnable example.
The pattern is simple:
Agent with a system promptagent.addCapability()provision() to register on the platform (pass agent.instance to bind credentials)run(agent) to startmy-agent/
├── src/agent.ts
├── .env
├── .gitignore
├── package.json
└── tsconfig.jsonnpm init -y && npm pkg set type=module
npm i @openserv-labs/sdk @openserv-labs/client dotenv zod
npm i -D @types/node tsx typescriptNote: The project must use
"type": "module"inpackage.json. Add a"dev": "tsx src/agent.ts"script for local development. Only installopenaiif you use theprocess()method for direct OpenAI calls.
Most agents don't need any LLM API key—use runless capabilities or generate() and the platform handles LLM calls for you. If you use process() for direct OpenAI calls, set OPENAI_API_KEY. The rest is filled by provision().
# Only needed if you use process() for direct OpenAI calls:
# OPENAI_API_KEY=your-openai-key
# ANTHROPIC_API_KEY=your_anthropic_key # If using Claude directly
# Required for deploy (get from OpenServ platform dashboard)
OPENSERV_USER_API_KEY=your-user-api-key
# Auto-populated by provision():
WALLET_PRIVATE_KEY=
OPENSERV_API_KEY=
OPENSERV_AUTH_TOKEN=
PORT=7378
# Production: skip tunnel and run HTTP server only
# DISABLE_TUNNEL=true
# Force tunnel even when endpointUrl is set
# FORCE_TUNNEL=trueCapabilities come in two flavors:
Runless capabilities don't need a run function—the platform handles the AI call automatically. Just provide a name and description:
// Simplest form — just name + description
agent.addCapability({
name: 'generate_haiku',
description: 'Generate a haiku poem (5-7-5 syllables) about the given input.'
})
// With custom input schema
agent.addCapability({
name: 'translate',
description: 'Translate text to the target language.',
inputSchema: z.object({
text: z.string(),
targetLanguage: z.string()
})
})
// With structured output
agent.addCapability({
name: 'analyze_sentiment',
description: 'Analyze the sentiment of the given text.',
outputSchema: z.object({
sentiment: z.enum(['positive', 'negative', 'neutral']),
confidence: z.number().min(0).max(1)
})
})run function — the platform performs the LLM callinputSchema is optional — defaults to z.object({ input: z.string() }) if omittedoutputSchema is optional — define it for structured output from the platformSee examples/haiku-poet-agent.ts for a complete runless example.
Runnable capabilities have a run function for custom logic. Each requires:
name - Unique identifierdescription - What it does (helps AI decide when to use it)inputSchema - Zod schema defining parametersrun - Function returning a stringagent.addCapability({
name: 'greet',
description: 'Greet a user by name',
inputSchema: z.object({ name: z.string() }),
async run({ args }) {
return `Hello, ${args.name}!`
}
})See examples/capability-example.ts for basic capabilities.
Note: The
schemaproperty still works as an alias forinputSchemabut is deprecated. UseinputSchemafor new code.
Access this in capabilities to use agent methods like addLogToTask(), uploadFile(), generate(), etc.
See examples/capability-with-agent-methods.ts for logging and file upload patterns.
generate() — Platform-Delegated LLM CallsThe generate() method lets you make LLM calls without any API key. The platform performs the call and records usage to the workspace.
// Text generation
const poem = await this.generate({
prompt: `Write a short poem about ${args.topic}`,
action
})
// Structured output (returns validated object matching the schema)
const metadata = await this.generate({
prompt: `Suggest a title and 3 tags for: ${poem}`,
outputSchema: z.object({
title: z.string(),
tags: z.array(z.string()).length(3)
}),
action
})
// With conversation history
const followUp = await this.generate({
prompt: 'Suggest a related topic.',
messages, // conversation history from run function
action
})Parameters:
prompt (string) — The prompt for the LLMaction (ActionSchema) — The action context (passed into your run function)outputSchema (Zod schema, optional) — When provided, returns a validated structured outputmessages (array, optional) — Conversation history for multi-turn generationThe action parameter is required because it identifies the workspace/task for billing. Use it inside runnable capabilities where action is available from the run function arguments.
await agent.createTask({ workspaceId, assignee, description, body, input, dependencies })
await agent.updateTaskStatus({ workspaceId, taskId, status: 'in-progress' })
await agent.addLogToTask({ workspaceId, taskId, severity: 'info', type: 'text', body: '...' })
await agent.markTaskAsErrored({ workspaceId, taskId, error: 'Something went wrong' })
const task = await agent.getTaskDetail({ workspaceId, taskId })
const tasks = await agent.getTasks({ workspaceId })const files = await agent.getFiles({ workspaceId })
await agent.uploadFile({ workspaceId, path: 'output.txt', file: 'content', taskIds: [taskId] })
await agent.deleteFile({ workspaceId, fileId })The action parameter in capabilities is a union type — task only exists on the 'do-task' variant. Always narrow with a type guard before accessing action.task:
async run({ args, action }) {
// action.task does NOT exist on all action types — you must narrow first
if (action?.type === 'do-task' && action.task) {
const { workspace, task } = action
workspace.id // Workspace ID
workspace.goal // Workspace goal
task.id // Task ID
task.description // Task description
task.input // Task input
action.me.id // Current agent ID
}
}Do not extract action?.task?.id before the type guard — TypeScript will error with Property 'task' does not exist on type 'ActionSchema'.
The workflow object in provision() requires two important properties:
name (string) - This becomes the agent name in ERC-8004. Make it polished, punchy, and memorable — this is the public-facing brand name users see. Think product launch, not variable name. Examples: 'Crypto Alpha Scanner', 'AI Video Studio', 'Instant Blog Machine'.goal (string, required) - A detailed description of what the workflow accomplishes. Must be descriptive and thorough — short or vague goals will cause API calls to fail. Write at least a full sentence explaining the workflow's purpose.workflow: {
name: 'Haiku Poetry Generator', // Polished display name — the ERC-8004 agent name users see
goal: 'Transform any theme or emotion into a beautiful traditional 5-7-5 haiku poem using AI',
trigger: triggers.x402({ ... }),
task: { description: 'Generate a haiku about the given topic' }
}import { triggers } from '@openserv-labs/client'
triggers.webhook({ waitForCompletion: true, timeout: 600 })
triggers.x402({ name: '...', description: '...', price: '0.01', timeout: 600 })
triggers.cron({ schedule: '0 9 * * *' })
triggers.manual()Important: Always set
timeoutto at least 600 seconds (10 minutes) for webhook and x402 triggers. Agents often take significant time to process requests — especially when performing research, content generation, or other complex tasks. A low timeout will cause premature failures. For multi-agent pipelines with many sequential steps, consider 900 seconds or more.
provision() creates two types of credentials. They are not interchangeable:
OPENSERV_API_KEY (Agent API key) — Used internally by the SDK to authenticate when receiving tasks. Set automatically by provision() when you pass agent.instance. Do not use this key with PlatformClient.WALLET_PRIVATE_KEY / OPENSERV_USER_API_KEY (User credentials) — Used with PlatformClient to make management calls (list tasks, debug workflows, etc.). Authenticate with client.authenticate(walletKey) or pass apiKey to the constructor.If you need to debug tasks or inspect workflows, use wallet authentication:
const client = new PlatformClient()
await client.authenticate(process.env.WALLET_PRIVATE_KEY)
const tasks = await client.tasks.list({ workflowId: result.workflowId })See troubleshooting.md for details on 401 errors.
npm run devThe run() function automatically:
agents-proxy.openserv.aiNo need for ngrok or other tunneling tools - run() handles this seamlessly. Just call run(agent) and your local agent is accessible to the platform.
Deploy your agent to the OpenServ managed cloud with a single command:
npx @openserv-labs/client deploy [path]Where [path] is the directory containing your agent code (defaults to current directory).
OPENSERV_USER_API_KEY in .env — Your .env file in the agent directory must contain OPENSERV_USER_API_KEY. Get this from the OpenServ platform dashboard. This key is required by the deploy command (and by PlatformClient for management operations). Note that provision() itself does not need this key — it creates its own wallet, authenticates, and persists credentials to .openserv.json independently. The user API key is also saved to .openserv.json after provision if present.
Call provision() first — provision() must run at least once before deploying. It registers the agent on the platform and persists credentials to .openserv.json. The recommended agent template already calls provision() before run(agent) in main(), so starting the agent locally (npm run dev or npx tsx src/agent.ts) is enough. If your code does not call provision() (e.g., you only call run(agent) in a custom script), you must add an explicit provision() call and run it once before deploying.
1. Set OPENSERV_USER_API_KEY in .env
2. Call provision() during local startup (npm run dev) — registers the agent and writes .openserv.json
3. npx @openserv-labs/client deploy .When deploying to a hosting provider like Cloud Run, set DISABLE_TUNNEL=true as an environment variable. This makes run() start only the HTTP server without opening a WebSocket tunnel — the platform reaches your agent directly at its public URL.
await provision({
agent: {
name: 'my-agent',
description: '...',
endpointUrl: 'https://my-agent.example.com' // Required for production
},
workflow: {
name: 'Lightning Service Pro',
goal: 'Describe in detail what this workflow does — be thorough, vague goals cause failures',
trigger: triggers.webhook({ waitForCompletion: true, timeout: 600 }),
task: { description: 'Process incoming requests' }
}
})
// With DISABLE_TUNNEL=true, run() starts only the HTTP server (no tunnel)
await run(agent)After provisioning, register your agent on-chain for discoverability via the Identity Registry.
Requires ETH on Base. Registration calls
register()on the ERC-8004 contract on Base mainnet (chain 8453), which costs gas. The wallet created byprovision()starts with a zero balance. Fund it with a small amount of ETH on Base before the first registration attempt. The wallet address is logged during provisioning (Created new wallet: 0x...).
Always wrap in try/catch so a registration failure (e.g. unfunded wallet) doesn't prevent
run(agent)from starting.
Two important patterns:
dotenv programmatically (not import 'dotenv/config') so you can reload .env after provision() writes WALLET_PRIVATE_KEY.dotenv.config({ override: true }) after provision() to pick up the freshly written key before ERC-8004 registration.import dotenv from 'dotenv'
dotenv.config()
import { Agent, run } from '@openserv-labs/sdk'
import { provision, triggers, PlatformClient } from '@openserv-labs/client'
// ... define agent and capabilities ...
const result = await provision({
agent: { instance: agent, name: 'my-agent', description: '...' },
workflow: {
name: 'My Service',
goal: 'Detailed description of what the workflow does',
trigger: triggers.x402({ name: 'My Service', description: '...', price: '0.01', timeout: 600 }),
task: { description: 'Process requests' }
}
})
// Reload .env to pick up WALLET_PRIVATE_KEY written by provision()
dotenv.config({ override: true })
// Register on-chain (non-blocking — requires funded wallet on Base)
try {
const client = new PlatformClient()
await client.authenticate(process.env.WALLET_PRIVATE_KEY)
const erc8004 = await client.erc8004.registerOnChain({
workflowId: result.workflowId,
privateKey: process.env.WALLET_PRIVATE_KEY!,
name: 'My Service',
description: 'What this agent does'
})
console.log(`Agent ID: ${erc8004.agentId}`) // "8453:42"
console.log(`TX: ${erc8004.blockExplorerUrl}`)
console.log(`Scan: ${erc8004.scanUrl}`) // "https://www.8004scan.io/agents/base/42"
} catch (error) {
console.warn('ERC-8004 registration skipped:', error instanceof Error ? error.message : error)
}
await run(agent)chainId / rpcUrl for others.See openserv-client skill for the full ERC-8004 API reference and troubleshooting.
this.process() inside capabilities — Legacy method requiring an OpenAI API key. Use this.generate() instead (platform-delegated, no key needed), or use runless capabilitiesdoTask override — The SDK handles task execution automaticallythis.completeTask() — Task completion is handled by the Runtime APIThis skill may be outdated. The OpenServ team ships updates regularly—new features, API changes, and bug fixes won't be reflected here until you update. If something isn't working as expected, or you want to make sure you have the latest information, update the skill before proceeding.
# Check if updates are available
npx skills check
# Update all installed skills to latest versions
npx skills updateOr reinstall the OpenServ skills directly:
npx skills add openserv-labs/skills© internet-court, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 12 other files in vendored/openserv/openserv-agent-sdk of internet-court/internet-court-skill.
Open the folder on GitHubat commit fa89195
We found 3 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 2 other GitHub owners. This page covers the copy in internet-court/internet-court-skill, which our catalogue first saw on October 7, 2026.
OpenServ Agent SDK next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| OpenServ Agent SDK this skillinternet-court/internet-court-skill | 6.6k | 2 repos | ~4.9k | Automated safety check: Notes | MIT | |
| LangChain Agent Fundamentalslangchain-ai/langchain-skills | 1.3k | — | ~3.1k | Automated safety check: Pass | MIT | |
| Langchain Middlewarelangchain-ai/langchain-skills | 1.3k | — | ~2.7k | Automated safety check: Pass | MIT | |
| Trigger.dev Agent Patternspapermark/papermark | 9.2k | — | ~2k | Automated safety check: Pass | Custom licence | |
| Routerbase API Integrationaiskillstore/marketplace | 433 | — | ~964 | Automated safety check: Pass | None | |
| OpenAPI to MCP Servermcp-use/mcp-use | 11k | — | ~5.2k | Automated safety check: Pass | Apache-2.0 |
langchain-ai/langchain-skills
Shows how to build LangChain agents with create_agent, define tools, add a checkpointer and use middleware for human approval and error handling, in Python and TypeScript.
langchain-ai/langchain-skills
INVOKE THIS SKILL when you need human-in-the-loop approval, custom middleware, or structured output.
papermark/papermark
Patterns for building LLM agents on Trigger.dev tasks: prompt chaining, routing, parallel workers, orchestrator-workers, evaluator loops and human approval gates.
aiskillstore/marketplace
Integrate applications with RouterBase, the OpenAI-compatible model gateway at https://routerbase.com/v1.
mcp-use/mcp-use
Turns an OpenAPI or Swagger spec into an MCP server with the mcp-use TypeScript SDK, mapping each operation to a tool, wiring auth, testing and deploying.
GetBindu/Bindu
Add a new self-contained example agent under examples/. An agent skill from GetBindu/Bindu.
internet-court/internet-court-skill
Uploads one Kleros-related file per paid request to IPFS through the Kleros x402 gateway for 0.01 USDC on Base, returning a CID that Kleros contracts can reference.
internet-court/internet-court-skill
Guides building on the 0G Compute Network, a decentralized GPU marketplace for AI inference and fine-tuning, with SDK patterns and CLI commands.
internet-court/internet-court-skill
Creates, trades and settles permissionless prediction markets on Solana with any SPL token as collateral, including social-media and custom-oracle markets.
internet-court/internet-court-skill
Connects an agent to the BNB Chain MCP server to read blocks and contracts, move tokens and NFTs, register ERC-8004 agents and use Greenfield storage.
internet-court/internet-court-skill
Specifies how a GenLayer Intelligent Contract decision about an agent's performance becomes an ERC-7710 revocation or policy change, through a relayer or bridge and an EVM controller.
internet-court/internet-court-skill
Specifies how a GenLayer Intelligent Contract should supervise an AI agent, with review rubrics, evidence schemas and continue, warn, constrain or revoke decisions.
Works with
Categories
Guides building and deploying TypeScript agents on the OpenServ platform, with runnable and runless capabilities, wallet-based sign-up and a local tunnel for development. This skill walks the agent through building a custom agent for the OpenServ platform in TypeScript. You define a system prompt plus capabilities.
OpenServ Agent SDK fits situations like: building a custom agent that runs on the OpenServ platform; adding runless or runnable capabilities to an existing OpenServ agent; registering an agent with the platform and starting it locally with the built-in tunnel; looking up task-handling and file-operation patterns from the bundled example agents.
Run `npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a claude-code`. Or copy the skill folder (vendored/openserv/openserv-agent-sdk in internet-court/internet-court-skill) into .claude/skills/openserv-agent-sdk in your project. Claude Code loads it when a task matches its description.
Run `npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a codex`. Or copy the skill folder (vendored/openserv/openserv-agent-sdk in internet-court/internet-court-skill) into .agents/skills/openserv-agent-sdk in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add internet-court/internet-court-skill --skill openserv-agent-sdk -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/openserv-agent-sdk, .gemini/skills/openserv-agent-sdk, .github/skills/openserv-agent-sdk and .opencode/skills/openserv-agent-sdk in your project.
Going by SKILL.md and its folder, OpenServ Agent SDK needs TypeScript for the scripts in its folder, the command-line tools its instructions call (npm and npx) and credentials named WALLET_PRIVATE_KEY, OPENSERV_USER_API_KEY, OPENAI_API_KEY and OPENSERV_API_KEY. Our summary lists: A TypeScript project using `@openserv-labs/sdk`; The companion `@openserv-labs/client` package; An OpenServ platform account (`provision()` can create one).
SKILL.md names 1 domain. In commands or code: 8004scan.io; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
OpenServ Agent SDK is published under the MIT licence (from the LICENSE file in the skill folder). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.9k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with OpenServ Agent SDK: LangChain Agent Fundamentals (langchain-ai/langchain-skills, 1.3k stars), Langchain Middleware (langchain-ai/langchain-skills, 1.3k stars), Trigger.dev Agent Patterns (papermark/papermark, 9.2k stars) and Routerbase API Integration (aiskillstore/marketplace, 433 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
internet-court (a GitHub organization) maintains it in internet-court/internet-court-skill, which has 6,551 GitHub stars. The repository holds 80 skills in this directory. The repository was last updated on August 19, 2026.
Source: internet-court/internet-court-skill on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.