File size: 3,523 Bytes
5844451 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | // ==================== Anthropic API Types ====================
export interface AnthropicRequest {
model: string;
messages: AnthropicMessage[];
max_tokens: number;
stream?: boolean;
system?: string | AnthropicContentBlock[];
tools?: AnthropicTool[];
tool_choice?: AnthropicToolChoice;
temperature?: number;
top_p?: number;
stop_sequences?: string[];
}
/** tool_choice 控制模型是否必须调用工具
* - auto: 模型自行决定(默认)
* - any: 必须调用至少一个工具
* - tool: 必须调用指定工具
*/
export type AnthropicToolChoice =
| { type: 'auto' }
| { type: 'any' }
| { type: 'tool'; name: string };
export interface AnthropicMessage {
role: 'user' | 'assistant';
content: string | AnthropicContentBlock[];
}
export interface AnthropicContentBlock {
type: 'text' | 'thinking' | 'tool_use' | 'tool_result' | 'image';
text?: string;
// thinking fields (Anthropic extended thinking)
thinking?: string;
signature?: string;
// image fields
source?: { type: string; media_type?: string; data: string };
// tool_use fields
id?: string;
name?: string;
input?: Record<string, unknown>;
// tool_result fields
tool_use_id?: string;
content?: string | AnthropicContentBlock[];
is_error?: boolean;
}
export interface AnthropicTool {
name: string;
description?: string;
input_schema: Record<string, unknown>;
}
export interface AnthropicResponse {
id: string;
type: 'message';
role: 'assistant';
content: AnthropicContentBlock[];
model: string;
stop_reason: string;
stop_sequence: string | null;
usage: {
input_tokens: number;
output_tokens: number;
cache_creation_input_tokens?: number;
cache_read_input_tokens?: number;
};
}
// ==================== Cursor API Types ====================
export interface CursorChatRequest {
context?: CursorContext[];
model: string;
id: string;
messages: CursorMessage[];
trigger: string;
maxTokens?: number;
max_tokens?: number;
}
export interface CursorContext {
type: string;
content: string;
filePath: string;
}
export interface CursorMessage {
parts: CursorPart[];
id: string;
role: string;
}
export interface CursorPart {
type: string;
text: string;
}
export interface CursorSSEEvent {
type: string;
delta?: string;
}
// ==================== Internal Types ====================
export interface ParsedToolCall {
name: string;
arguments: Record<string, unknown>;
}
export interface AppConfig {
port: number;
timeout: number;
proxy?: string;
cursorModel: string;
enableThinking?: boolean;
vision?: {
enabled: boolean;
mode: 'ocr' | 'api';
/** Multiple API providers to try in order; used when mode is 'api' */
providers: VisionProvider[];
/** If all API providers fail, fall back to local OCR (default: true) */
fallbackToOcr: boolean;
// Legacy single-provider fields kept for backward compat
baseUrl: string;
apiKey: string;
model: string;
};
fingerprint: {
userAgent: string;
};
}
export interface VisionProvider {
name?: string;
baseUrl: string;
apiKey: string;
model: string;
}
|