Angular 的副驾驶 Kit 软件
用于副驾驶Kit核心和AG-UI代理的角装订. 这个软件包为建筑定制,无头副驾驶UI提供服务,指令和公用事业.
安装
# npm
npm install @copilotkit/{core,angular}
@angular/core财务报告和审定财务报表@angular/common(19岁以上)@angular/cdk(匹配您的角主)rxjs
快开始
(1) 提供副驾驶Kit
在应用程序配置中配置运行时间和工具 :
import { ApplicationConfig } from "@angular/core";
import { provideCopilotKit } from "@copilotkit/angular";
export const appConfig: ApplicationConfig = {
providers: [
provideCopilotKit({
licenseKey: "ck_pub_your_public_api_key",
runtimeUrl: "http://localhost:3001/api/copilotkit",
headers: { Authorization: "Bearer ..." },
properties: { app: "demo" },
}),
],
};
2) 构建自定义用户界面 injectAgentStore
import { Component, inject, signal } from "@angular/core";
import { Message } from "@ag-ui/client";
import { CopilotKit, injectAgentStore } from "@copilotkit/angular";
import { randomUUID } from "@copilotkit/shared";
@Component({
template: `
@for (let message of messages(); track message.id) {
<div>
<em>{{ message.role }}</em>
<p>{{ message.content }}</p>
</div>
}
<input
[value]="input()"
(input)="input.set($any($event.target).value)"
(keyup.enter)="send()"
/>
<button (click)="send()" [disabled]="store().isRunning()">Send</button>
`,
})
export class HeadlessChatComponent {
readonly copilotKit = inject(CopilotKit);
readonly store = injectAgentStore("default");
readonly messages = this.store().messages;
readonly input = signal("");
async send() {
const content = this.input().trim();
if (!content) return;
const agent = this.store().agent;
agent.addMessage({
id: randomUUID(),
role: "user",
content,
});
this.input.set("");
await this.copilotKit.core.runAgent({ agent });
}
}
这个 agent 是一个AG-UI AbstractAgent。请参考您的 AG-UI 代理执行 .
核心配置
CopilotKitConfig
provideCopilotKit 接受一个 CopilotKitConfig 对象 :
export interface CopilotKitConfig {
runtimeUrl?: string;
headers?: Record<string, string>;
licenseKey?: string;
properties?: Record<string, unknown>;
agents?: Record<string, AbstractAgent>;
tools?: ClientTool[];
renderToolCalls?: RenderToolCallConfig[];
frontendTools?: FrontendToolConfig[];
humanInTheLoop?: HumanInTheLoopConfig[];
}
runtimeUrl: URL 到您的副驾驶 Kit 运行时间 .headers: 发送到运行时间的默认信头 .licenseKey:副驾驶云公用API密钥(ck_pub_...),根据要求provideCopilotKit。 。 。 .properties: 任意道具传输给代理运行.agents: 本地、 浏览器代理按键agentId。 。 。 .tools: 向运行时间(无处理器)发布工具定义.renderToolCalls: 在UI中提供工具调用组件.frontendTools: 有处理器的客户端工具.humanInTheLoop: 暂停用户输入的工具.
注射辅助器
provideCopilotKit(config)提供方CopilotKitConfig。 。 。 .
CopilotKit 服务
只读信号
agents数字 :Signal<Record<string, AbstractAgent>>runtimeConnectionStatus数字 :Signal<CopilotKitCoreRuntimeConnectionStatus>runtimeUrl数字 :Signal<string | undefined>runtimeTransport数字 :Signal<CopilotRuntimeTransport>(单位:千美元)"rest" | "single"(中文(简体) )headers数字 :Signal<Record<string, string>>toolCallRenderConfigs数字 :Signal<RenderToolCallConfig[]>clientToolCallRenderConfigs数字 :Signal<FrontendToolConfig[]>humanInTheLoopToolRenderConfigs数字 :Signal<HumanInTheLoopConfig[]>
方法
getAgent(agentId: string): AbstractAgent | undefinedaddFrontendTool(config: FrontendToolConfig & { injector: Injector }): voidaddRenderToolCall(config: RenderToolCallConfig): voidaddHumanInTheLoop(config: HumanInTheLoopConfig): voidremoveTool(toolName: string, agentId?: string): voidupdateRuntime(options: { runtimeUrl?: string; runtimeTransport?: CopilotRuntimeTransport; headers?: Record<string,string>; properties?: Record<string, unknown>; agents?: Record<string, AbstractAgent>; }): void
高级
core: 基础CopilotKitCore举个例子.
探员
injectAgentStore
const store = injectAgentStore("default");
// or: injectAgentStore(signal(agentId))
回返a Signal<AgentStore>。该商店揭露:
agent数字 :AbstractAgentmessages数字 :Signal<Message[]>state数字 :Signal<any>isRunning数字 :Signal<boolean>teardown(): 清理订阅
如果该代理人无法在当地找到,但 runtimeUrl 在运行时间连接时创建代理代理。 如果代理仍然无法解决,则会抛出一个包含已配置的运行时间和已知代理ID的错误.
CopilotkitAgentFactory
用于创建的先进工厂 AgentStore 信号 大部分应用程序应该使用 injectAgentStore 换句话说.
代理上下文
connectAgentContext
连接 AG- UI 上下文到运行时间( 当效果被销毁时自动清理) :
import { connectAgentContext } from "@copilotkit/angular";
connectAgentContext({
description: "User preferences",
value: { theme: "dark" },
});
您必须在注入语境中(例如在组件构造器或 runInInjectionContext),或通过一个明确的 Injector数字 :
connectAgentContext(contextSignal, { injector });
工具和工具渲染
类型
export interface RenderToolCallConfig<Args> {
name: string; // tool name, or "*" for wildcard
args: z.ZodType<Args>; // Zod schema for args
component: Type<ToolRenderer<Args>>;
agentId?: string; // optional agent scope
}
export interface FrontendToolConfig<Args> {
name: string;
description: string;
parameters: z.ZodType<Args>;
component?: Type<ToolRenderer<Args>>; // optional UI renderer
handler: (args: Args, context: FrontendToolHandlerContext) => Promise<unknown>;
agentId?: string;
}
export interface HumanInTheLoopConfig<Args> {
name: string;
description: string;
parameters: z.ZodType<Args>;
component: Type<HumanInTheLoopToolRenderer<Args>>;
agentId?: string;
}
export type ClientTool<Args> = Omit<FrontendTool<Args>, \"handler\"> & {
renderer?: Type<ToolRenderer<Args>>;
};
渲染器组件收到信号 :
export interface ToolRenderer<Args> {
toolCall: Signal<AngularToolCall<Args>>;
}
export interface HumanInTheLoopToolRenderer<Args> {
toolCall: Signal<HumanInTheLoopToolCall<Args>>; // includes respond(result)
}
AngularToolCall 编号 : HumanInTheLoopToolCall 曝光 args, (中文(简体) ), status (单位:千美元)"in-progress" | "executing" | "complete"),以及 result。 。 。 .
与 DI 注册工具
当当前注射上下文被销毁时, 这些帮助者自动移动工具 :
从注入语境(例如组件构建器、指令或 runInInjectionContext) (中文(简体) ).
import {
registerFrontendTool,
registerRenderToolCall,
registerHumanInTheLoop,
} from "@copilotkit/angular";
import { z } from "zod";
registerFrontendTool({
name: "lookup",
description: "Fetch a record",
parameters: z.object({ id: z.string() }),
handler: async ({ id }) => ({ id, ok: true }),
});
registerRenderToolCall({
name: "*", // wildcard renderer
args: z.any(),
component: MyToolCallRenderer,
});
registerHumanInTheLoop({
name: "approval",
description: "Request approval",
parameters: z.object({ reason: z.string() }),
component: ApprovalRenderer,
});
配置工具在 provideCopilotKit
provideCopilotKit({
licenseKey: "ck_pub_your_public_api_key",
frontendTools: [
/* FrontendToolConfig[] */
],
renderToolCalls: [
/* RenderToolCallConfig[] */
],
humanInTheLoop: [
/* HumanInTheLoopConfig[] */
],
tools: [
/* ClientTool[] */
],
});
tools 发布到运行时间。 如果包含 renderer + 键 parameters 编号 ClientTool,CopilotKit也会注册一个工具调用渲染器.
RenderToolCalls 组件
RenderToolCalls 将工具调用组件置于基于已注册的渲染配置的助理消息下.
<copilot-render-tool-calls
[message]="assistantMessage"
[messages]="messages"
[isLoading]="isRunning"
></copilot-render-tool-calls>
输入 :
message数字 :AssistantMessage(必须包括toolCalls(中文(简体) )messages: 满Message[]列表(用于查找工具结果)isLoading: 代理正在运行中
工具参数用 partialJSONParse如此不完整的JSON 在流水中仍然会.
运行时间笔记
- 设定
runtimeUrl到您的副驾驶 Kit 运行时间终点 . - 如果您在运行时需要更改运行时间设置, 请打电话
CopilotKit.updateRuntime(...)。 。 。 . runtimeTransport支持"rest"或者说"single"(SSE单流运输).
这里没有文件
此软件包还导出一组完整的聊天 UI 组件 src/lib/components/chat。这些API被有意省略出在本研究中.