mmsp-python
Guidance for using the MMSP Python SDK (`mmsp`). Use when developing agents that call different LLM APIs, need a unified…
Guidance for using the MMSP TypeScript SDK (`@prismshadow/mmsp`). Use when developing agents that call different LLM APIs, need a unified interface for LLM providers, mention MMSP, request `@prismshadow/mmsp`, or already import it.
$ npx -y skills add Prism-Shadow/model-message-stream-protocol --skill mmsp-typescript --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/mmsp-typescriptContext preview
The summary Claude sees to decide when to auto-load this skill.
Guidance for using the MMSP TypeScript SDK (`@prismshadow/mmsp`). Use when developing agents that call different LLM APIs, need a unified interface for LLM providers, mention MMSP, request `@prismshadow/mmsp`, or already import it.
name: mmsp-typescript description: Guidance for using the MMSP TypeScript SDK (`@prismshadow/mmsp`). Use when developing agents that call different LLM APIs, need a unified interface for LLM providers, mention MMSP, request `@prismshadow/mmsp`, or already import it.
MMSP is a unified SDK for calling LLMs across providers with shared data models, tool calling, tracing, and playground support.
npm install @prismshadow/mmsp
For model IDs, API keys, and base URLs, see [Model selection](reference/models.md).
This example asks GPT to call a weather tool, runs the tool, then sends the result back.
import { AutoLLMClient, ToolCallDoneItem } from "@prismshadow/mmsp";
function getWeather(location: string): string {
return `Temperature in ${location}: 22 C`;
}
// Map tool names to their implementations so calls can be dispatched by name.
const TOOLS: Record<string, (args: Record<string, any>) => string> = {
get_weather: (args) => getWeather(args.location as string),
};
async function main(): Promise<void> {
const weatherTool = {
name: "get_weather",
description: "Gets the current weather for a given location.",
parameters: {
type: "object" as const,
properties: {
location: {
type: "string" as const,
description: "The city name",
},
},
required: ["location"],
},
};
const client = new AutoLLMClient({ model: "gpt-5.5" });
const config = { tools: [weatherTool] };
let toolCall: ToolCallDoneItem | null = null;
for await (const event of client.streamingResponseStateful({
message: {
role: "user",
content_items: [{ type: "text.done", text: "What's the weather in London?" }],
},
config,
})) {
if (event.event_type === "stop") {
// Always the last event, exactly once: the response has finished.
console.log(event.finish_reason, event.usage_metadata);
}
for (const item of event.content_items) {
if (item.type === "tool_call.done") {
toolCall = item; // the complete call; tool_call.delta items are fragments
}
}
}
if (toolCall) {
// Dispatch by tool name instead of hardcoding the function.
const result = TOOLS[toolCall.name](toolCall.arguments);
for await (const event of client.streamingResponseStateful({
message: {
role: "user",
content_items: [
{
type: "tool_result.done",
text: result,
tool_call_id: toolCall.tool_call_id,
},
],
},
config,
})) {
console.log(event);
// Streams the answer as text.delta fragments, closes it with text.done, then one stop event carrying usage:
// { role: 'assistant', event_type: 'delta', content_items: [ { type: 'text.delta', text: 'The' } ], usage_metadata: null, finish_reason: null }
// { role: 'assistant', event_type: 'delta', content_items: [ { type: 'text.delta', text: ' weather' } ], usage_metadata: null, finish_reason: null }
// { role: 'assistant', event_type: 'delta', content_items: [ { type: 'text.delta', text: ' is 22 C.' } ], usage_metadata: null, finish_reason: null }
// { role: 'assistant', event_type: 'delta', content_items: [ { type: 'text.done', text: 'The weather is 22 C.' } ], usage_metadata: null, finish_reason: null }
// { role: 'assistant', event_type: 'stop', content_items: [], usage_metadata: { cached_tokens: 0, prompt_tokens: 12, thoughts_tokens: 0, response_tokens: 8 }, finish_reason: 'stop' }
}
}
}
void main();Keep these points in mind for agent loops:
Integrate every model the same way, and keep one API in your head instead of one per provider.
Guidance for using the MMSP Python SDK (`mmsp`). Use when developing agents that call different LLM APIs, need a unified…