1
8
9
10export type ProviderId = "openai" | "anthropic" | "google" | "oss" | "custom";
11
12
13export interface ModelInfo {
14 id: string;
15 provider: ProviderId;
16 kind: "chat" | "embed" | "chat+embed";
17 contextWindow: number;
18 maxOutput: number;
19 toolCalls: boolean;
20 vision: boolean;
21
22 pricePer1kIn: number;
23
24 pricePer1kOut: number;
25
26 dimension: number;
27}
28
29export type Role = "system" | "user" | "assistant" | "tool";
30
31
32export type ContentPart =
33 | { type: "text"; text: string }
34 | { type: "image_url"; image_url: { url: string } };
35
36export interface ToolCall {
37 id: string;
38 name: string;
39 arguments: Record<string, unknown>;
40}
41
42
50export interface ToolSpec {
51 name: string;
52 description: string;
53 parameters: Record<string, unknown>;
54}
55
56export interface ChatMessage {
57 role: Role;
58 content: string | ContentPart[];
59
60 toolCalls?: ToolCall[];
61
62 toolCallId?: string;
63
64 name?: string;
65}
66
67export interface ChatRequest {
68 model: string;
69 messages: ChatMessage[];
70 tools?: ToolSpec[];
71 toolChoice?: "auto" | "none" | { name: string };
72 temperature?: number;
73 maxTokens?: number;
74 stream?: boolean;
75
76 metadata?: Record<string, string>;
77
82 signal?: AbortSignal;
83}
84
85
86export interface ChatChunk {
87 delta?: string;
88 toolCallDelta?: ToolCall;
89 usage?: { in: number; out: number; total: number };
90 finishReason?: ChatResult["finishReason"];
91 done: boolean;
92}
93
94export interface ChatResult {
95 content: string;
96 toolCalls: ToolCall[];
97 usage: { in: number; out: number; total: number };
98 model: string;
99 latencyMs: number;
100 provider: ProviderId;
101 finishReason: "stop" | "tool_calls" | "length" | "error";
102}
103
104export interface EmbedRequest {
105 model: string;
106 texts: string[];
107 metadata?: Record<string, string>;
108}
109
110export interface EmbedResult {
111 model: string;
112 dimension: number;
113 vectors: number[][];
114 usage: { tokens: number };
115 latencyMs: number;
116 provider: ProviderId;
117}
118
119
124export interface ProviderAdapter {
125 id: ProviderId;
126 models(): Promise<ModelInfo[]>;
127 chat(req: ChatRequest): AsyncIterable<ChatChunk>;
128 embed(req: EmbedRequest): Promise<EmbedResult>;
129 health(): Promise<{ ok: boolean; latencyMs: number }>;
130}
131