用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/vercel-labs/seal --skill ai-python-custom-provider命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | ai-python-custom-provider |
| description | Use for implementing custom providers in AI SDK for Python. |
| metadata | {"sdk-version":"0.2.1"} |
Providers emit model events. They do not run Python tools. ai.stream collects
events into a Message. ai.Agent adds tool execution, hooks, and replay.
Minimal shape:
from collections.abc import AsyncGenerator, Sequence
from typing import Any, Literal
import pydantic
import ai
class MyProtocol(ai.ProviderProtocol[Any]):
protocol_class_id: Literal["my_protocol"] = "my_protocol"
def stream(
self,
client: Any,
model: ai.Model,
messages: list[ai.messages.Message],
*,
tools: Sequence[ai.tools.Tool] | None = None,
output_type: type[pydantic.BaseModel] | None = None,
params: ai.InferenceRequestParams | None = None,
provider: str,
) -> AsyncGenerator[ai.events.Event]:
return self._stream(client, model, messages, tools=tools)
async def _stream(
self,
client: Any,
model: ai.Model,
messages: list[ai.messages.Message],
*,
tools: Sequence[ai.tools.Tool] | None,
) -> AsyncGenerator[ai.events.Event]:
yield ai.events.StreamStart()
yield ai.events.TextStart(block_id="text")
yield ai.events.TextDelta(block_id="text", chunk="Hello")
yield ai.events.TextEnd(block_id="text")
yield ai.events.StreamEnd()
class MyProvider(ai.Provider[Any]):
provider_class_id: Literal["my_provider"] = "my_provider"
name: str = "my"
default_base_url: str = "https://example.invalid"
def __init__(self, *, client: Any) -> None:
super().__init__()
self._set_client(client)
def default_protocol(self) -> ai.ProviderProtocol[Any]:
return MyProtocol()
async def list_models(self) -> list[str]:
return ["my-model"]
async def probe(self, model: ai.Model) -> None:
return None
model = ai.Model(id="my-model", provider=MyProvider(client=client))
For Python tool calls, emit ToolStart, ToolDelta, and ToolEnd:
yield ai.events.ToolStart(tool_call_id=tcid, tool_name=name)
yield ai.events.ToolDelta(tool_call_id=tcid, chunk=args_json)
yield ai.events.ToolEnd(
tool_call_id=tcid,
tool_call=ai.messages.DUMMY_TOOL_CALL,
)
The stream collector fills event.tool_call with the aggregated tool call.
Then Agent resolves and runs the tool.
If the provider runs its own built-in tool, emit BuiltinToolStart,
BuiltinToolDelta, BuiltinToolEnd, and BuiltinToolResult instead.
Do not implement a custom provider for normal app configuration. Prefer
ai.get_provider(...), ai.get_model(...), or a protocol override unless you
are adding a new upstream API adapter.