Members
The chaos.council.members sub-namespace manages AI council members. Each member is backed by a specific LLM provider and model, and can be given a system prompt to shape its perspective during council deliberations.
Method Reference
| Method | HTTP | Endpoint | Returns |
|---|---|---|---|
models() | GET | /v1/council/members/models | AvailableModelsResponse |
create(params) | POST | /v1/council/members | CouncilMember |
bulkCreate(params) | POST | /v1/council/members/bulk | BulkCreateResult |
list(includeInactive?) | GET | /v1/council/members | CouncilMember[] |
get(memberId) | GET | /v1/council/members/{memberId} | CouncilMember |
update(memberId, params) | PUT | /v1/council/members/{memberId} | CouncilMember |
delete(memberId) | DELETE | /v1/council/members/{memberId} | void |
Discover Available Models
Before creating members, list the LLM providers and models available to your account.
import { Chaos } from '@chaoslabs/ai-sdk';
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
const { models } = await chaos.council.members.models();
for (const model of models) {
console.log(`${model.provider} / ${model.model_id}`);
}
// anthropic / claude-sonnet-4-20250514
// openai / gpt-4o
// ...AvailableModelsResponse
interface AvailableModelsResponse {
models: AvailableModel[];
}
interface AvailableModel {
provider: string;
model_id: string;
}Create a Member
Create a single council member. Provide a name, provider, and model_id from the available models list. Optionally include a description and system_prompt to shape the member's perspective.
import { Chaos } from '@chaoslabs/ai-sdk';
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
const member = await chaos.council.members.create({
name: 'Risk Analyst',
provider: 'anthropic',
model_id: 'claude-sonnet-4-20250514',
description: 'Conservative risk analyst focused on protocol safety',
system_prompt: 'You are a DeFi risk analyst. Prioritize safety, downside protection, and protocol solvency in all assessments.',
});
console.log(member.id); // 'mem-abc123'
console.log(member.name); // 'Risk Analyst'
console.log(member.status); // 'active'
console.log(member.council_count); // 0CreateCouncilMemberParams
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the member |
provider | string | Yes | LLM provider (e.g., "anthropic", "openai") |
model_id | string | Yes | Model identifier (e.g., "claude-sonnet-4-20250514") |
description | string | No | Human-readable description of the member's role |
system_prompt | string | No | System prompt that shapes the member's perspective during deliberation |
Bulk Create Members
Create multiple members in a single request. The operation is partially atomic -- some members may succeed while others fail. The response separates successes from failures so you can handle each case.
import { Chaos } from '@chaoslabs/ai-sdk';
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
const { created, failed } = await chaos.council.members.bulkCreate({
members: [
{
name: 'Risk Analyst',
provider: 'anthropic',
model_id: 'claude-sonnet-4-20250514',
system_prompt: 'Prioritize safety and downside protection.',
},
{
name: 'Growth Strategist',
provider: 'openai',
model_id: 'gpt-4o',
system_prompt: 'Focus on opportunity and upside potential.',
},
{
name: 'Quant Researcher',
provider: 'anthropic',
model_id: 'claude-sonnet-4-20250514',
system_prompt: 'Base decisions on data and statistical evidence.',
},
],
});
console.log(`Created: ${created.length}`);
console.log(`Failed: ${failed.length}`);
for (const member of created) {
console.log(` ${member.name} (${member.id})`);
}
for (const failure of failed) {
console.log(` Index ${failure.index}: ${failure.error}`);
console.log(` Request: ${failure.request.name} (${failure.request.provider}/${failure.request.model_id})`);
}List, Get, Update, Delete
Manage the full lifecycle of council members.
import { Chaos } from '@chaoslabs/ai-sdk';
const chaos = new Chaos({ apiKey: process.env.CHAOS_API_KEY! });
// List active members (default)
const activeMembers = await chaos.council.members.list();
// List all members including inactive
const allMembers = await chaos.council.members.list(true);
for (const m of allMembers) {
console.log(`${m.name} [${m.status}] — ${m.provider}/${m.model_id} — ${m.council_count} councils`);
}
// Get a specific member
const member = await chaos.council.members.get('mem-abc123');
console.log(`${member.name}: ${member.system_prompt}`);
// Update a member
const updated = await chaos.council.members.update('mem-abc123', {
name: 'Senior Risk Analyst',
system_prompt: 'You are a senior DeFi risk analyst with 10 years of experience.',
});
// Deactivate a member
await chaos.council.members.update('mem-abc123', { status: 'inactive' });
// Delete a member permanently
await chaos.council.members.delete('mem-abc123');UpdateCouncilMemberParams
All fields are optional. Only include the fields you want to change.
| Field | Type | Description |
|---|---|---|
name | string | Updated display name |
provider | string | Updated LLM provider |
model_id | string | Updated model identifier |
description | string | Updated description |
system_prompt | string | Updated system prompt |
status | string | Member status (e.g., "active", "inactive") |
CouncilMember
The response object returned by create, get, update, and list operations.
| Field | Type | Description |
|---|---|---|
id | string | Unique member identifier |
name | string | Display name |
provider | string | LLM provider |
model_id | string | Model identifier |
description | string | null | Optional description |
system_prompt | string | null | Optional system prompt |
status | string | Current status |
council_count | number | Number of councils this member belongs to |