gencode-ai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +11 -0
- package/CLAUDE.md +70 -0
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/agent/agent.d.ts +84 -0
- package/dist/agent/agent.d.ts.map +1 -0
- package/dist/agent/agent.js +233 -0
- package/dist/agent/agent.js.map +1 -0
- package/dist/agent/index.d.ts +6 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +6 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/types.d.ts +47 -0
- package/dist/agent/types.d.ts.map +1 -0
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -0
- package/dist/cli/components/App.d.ts +14 -0
- package/dist/cli/components/App.d.ts.map +1 -0
- package/dist/cli/components/App.js +395 -0
- package/dist/cli/components/App.js.map +1 -0
- package/dist/cli/components/CommandSuggestions.d.ts +13 -0
- package/dist/cli/components/CommandSuggestions.d.ts.map +1 -0
- package/dist/cli/components/CommandSuggestions.js +32 -0
- package/dist/cli/components/CommandSuggestions.js.map +1 -0
- package/dist/cli/components/Header.d.ts +9 -0
- package/dist/cli/components/Header.d.ts.map +1 -0
- package/dist/cli/components/Header.js +13 -0
- package/dist/cli/components/Header.js.map +1 -0
- package/dist/cli/components/Input.d.ts +13 -0
- package/dist/cli/components/Input.d.ts.map +1 -0
- package/dist/cli/components/Input.js +27 -0
- package/dist/cli/components/Input.js.map +1 -0
- package/dist/cli/components/Logo.d.ts +2 -0
- package/dist/cli/components/Logo.d.ts.map +1 -0
- package/dist/cli/components/Logo.js +8 -0
- package/dist/cli/components/Logo.js.map +1 -0
- package/dist/cli/components/Messages.d.ts +37 -0
- package/dist/cli/components/Messages.d.ts.map +1 -0
- package/dist/cli/components/Messages.js +106 -0
- package/dist/cli/components/Messages.js.map +1 -0
- package/dist/cli/components/ModelSelector.d.ts +13 -0
- package/dist/cli/components/ModelSelector.d.ts.map +1 -0
- package/dist/cli/components/ModelSelector.js +72 -0
- package/dist/cli/components/ModelSelector.js.map +1 -0
- package/dist/cli/components/Spinner.d.ts +12 -0
- package/dist/cli/components/Spinner.d.ts.map +1 -0
- package/dist/cli/components/Spinner.js +45 -0
- package/dist/cli/components/Spinner.js.map +1 -0
- package/dist/cli/components/index.d.ts +12 -0
- package/dist/cli/components/index.d.ts.map +1 -0
- package/dist/cli/components/index.js +12 -0
- package/dist/cli/components/index.js.map +1 -0
- package/dist/cli/components/theme.d.ts +31 -0
- package/dist/cli/components/theme.d.ts.map +1 -0
- package/dist/cli/components/theme.js +36 -0
- package/dist/cli/components/theme.js.map +1 -0
- package/dist/cli/index-legacy.d.ts +7 -0
- package/dist/cli/index-legacy.d.ts.map +1 -0
- package/dist/cli/index-legacy.js +431 -0
- package/dist/cli/index-legacy.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +116 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ink-cli.d.ts +7 -0
- package/dist/cli/ink-cli.d.ts.map +1 -0
- package/dist/cli/ink-cli.js +105 -0
- package/dist/cli/ink-cli.js.map +1 -0
- package/dist/cli/session-picker.d.ts +16 -0
- package/dist/cli/session-picker.d.ts.map +1 -0
- package/dist/cli/session-picker.js +280 -0
- package/dist/cli/session-picker.js.map +1 -0
- package/dist/cli/ui.d.ts +61 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +364 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/manager.d.ts +31 -0
- package/dist/config/manager.d.ts.map +1 -0
- package/dist/config/manager.js +65 -0
- package/dist/config/manager.js.map +1 -0
- package/dist/config/types.d.ts +22 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +6 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +9 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/init.d.ts +20 -0
- package/dist/memory/init.d.ts.map +1 -0
- package/dist/memory/init.js +332 -0
- package/dist/memory/init.js.map +1 -0
- package/dist/memory/manager.d.ts +85 -0
- package/dist/memory/manager.d.ts.map +1 -0
- package/dist/memory/manager.js +234 -0
- package/dist/memory/manager.js.map +1 -0
- package/dist/memory/types.d.ts +74 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/permissions/index.d.ts +7 -0
- package/dist/permissions/index.d.ts.map +1 -0
- package/dist/permissions/index.js +6 -0
- package/dist/permissions/index.js.map +1 -0
- package/dist/permissions/manager.d.ts +32 -0
- package/dist/permissions/manager.d.ts.map +1 -0
- package/dist/permissions/manager.js +79 -0
- package/dist/permissions/manager.js.map +1 -0
- package/dist/permissions/types.d.ts +14 -0
- package/dist/permissions/types.d.ts.map +1 -0
- package/dist/permissions/types.js +17 -0
- package/dist/permissions/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts +20 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +185 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/gemini.d.ts +21 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +241 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +34 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +72 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai.d.ts +19 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +221 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/types.d.ts +125 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +6 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +6 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +101 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +295 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/types.d.ts +39 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +10 -0
- package/dist/session/types.js.map +1 -0
- package/dist/tools/builtin/bash.d.ts +7 -0
- package/dist/tools/builtin/bash.d.ts.map +1 -0
- package/dist/tools/builtin/bash.js +80 -0
- package/dist/tools/builtin/bash.js.map +1 -0
- package/dist/tools/builtin/edit.d.ts +7 -0
- package/dist/tools/builtin/edit.d.ts.map +1 -0
- package/dist/tools/builtin/edit.js +32 -0
- package/dist/tools/builtin/edit.js.map +1 -0
- package/dist/tools/builtin/glob.d.ts +7 -0
- package/dist/tools/builtin/glob.d.ts.map +1 -0
- package/dist/tools/builtin/glob.js +36 -0
- package/dist/tools/builtin/glob.js.map +1 -0
- package/dist/tools/builtin/grep.d.ts +7 -0
- package/dist/tools/builtin/grep.d.ts.map +1 -0
- package/dist/tools/builtin/grep.js +59 -0
- package/dist/tools/builtin/grep.js.map +1 -0
- package/dist/tools/builtin/read.d.ts +7 -0
- package/dist/tools/builtin/read.d.ts.map +1 -0
- package/dist/tools/builtin/read.js +29 -0
- package/dist/tools/builtin/read.js.map +1 -0
- package/dist/tools/builtin/write.d.ts +7 -0
- package/dist/tools/builtin/write.d.ts.map +1 -0
- package/dist/tools/builtin/write.js +24 -0
- package/dist/tools/builtin/write.js.map +1 -0
- package/dist/tools/index.d.ts +38 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +32 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/registry.d.ts +22 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +71 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/types.d.ts +62 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +126 -0
- package/dist/tools/types.js.map +1 -0
- package/docs/README.md +16 -0
- package/docs/proposals/0001-web-fetch-tool.md +293 -0
- package/docs/proposals/0002-web-search-tool.md +306 -0
- package/docs/proposals/0003-task-subagents.md +333 -0
- package/docs/proposals/0004-plan-mode.md +338 -0
- package/docs/proposals/0005-todo-system.md +299 -0
- package/docs/proposals/0006-memory-system.md +539 -0
- package/docs/proposals/0007-context-management.md +429 -0
- package/docs/proposals/0008-checkpointing.md +327 -0
- package/docs/proposals/0009-hooks-system.md +343 -0
- package/docs/proposals/0010-mcp-integration.md +382 -0
- package/docs/proposals/0011-custom-commands.md +374 -0
- package/docs/proposals/0012-ask-user-question.md +317 -0
- package/docs/proposals/0013-multi-edit-tool.md +345 -0
- package/docs/proposals/0014-lsp-tool.md +478 -0
- package/docs/proposals/0015-ls-tool.md +407 -0
- package/docs/proposals/0016-kill-shell-tool.md +455 -0
- package/docs/proposals/0017-background-tasks.md +489 -0
- package/docs/proposals/0018-parallel-tool-execution.md +415 -0
- package/docs/proposals/0019-session-enhancements.md +462 -0
- package/docs/proposals/0020-session-summarization.md +447 -0
- package/docs/proposals/0021-skills-system.md +409 -0
- package/docs/proposals/0022-plugin-system.md +467 -0
- package/docs/proposals/0023-permission-enhancements.md +470 -0
- package/docs/proposals/0024-keyboard-shortcuts.md +443 -0
- package/docs/proposals/0025-cost-tracking.md +447 -0
- package/docs/proposals/0026-git-integration.md +475 -0
- package/docs/proposals/0027-enhanced-read-tool.md +514 -0
- package/docs/proposals/0028-enhanced-bash-tool.md +511 -0
- package/docs/proposals/0029-notebook-edit-tool.md +413 -0
- package/docs/proposals/0030-plugin-marketplace.md +360 -0
- package/docs/proposals/0031-command-suggestions.md +295 -0
- package/docs/proposals/0032-ide-integrations.md +328 -0
- package/docs/proposals/0033-enterprise-deployment.md +221 -0
- package/docs/proposals/0034-sandboxing.md +273 -0
- package/docs/proposals/0035-auto-updater.md +311 -0
- package/docs/proposals/0036-enhanced-glob-tool.md +267 -0
- package/docs/proposals/0037-enhanced-grep-tool.md +360 -0
- package/docs/proposals/0038-interactive-cli-ui.md +373 -0
- package/docs/proposals/0039-streaming-enhancements.md +359 -0
- package/docs/proposals/0040-multi-provider-enhancements.md +369 -0
- package/docs/proposals/README.md +84 -0
- package/docs/proposals/TEMPLATE.md +57 -0
- package/docs/proposals/research/claude-code-research.md +307 -0
- package/examples/agent-demo.ts +115 -0
- package/examples/basic.ts +166 -0
- package/package.json +50 -0
- package/src/agent/agent.ts +276 -0
- package/src/agent/index.ts +6 -0
- package/src/agent/types.ts +62 -0
- package/src/cli/components/App.tsx +565 -0
- package/src/cli/components/CommandSuggestions.tsx +58 -0
- package/src/cli/components/Header.tsx +36 -0
- package/src/cli/components/Input.tsx +60 -0
- package/src/cli/components/Logo.tsx +16 -0
- package/src/cli/components/Messages.tsx +210 -0
- package/src/cli/components/ModelSelector.tsx +135 -0
- package/src/cli/components/Spinner.tsx +72 -0
- package/src/cli/components/index.ts +21 -0
- package/src/cli/components/theme.ts +36 -0
- package/src/cli/index.tsx +136 -0
- package/src/config/index.ts +7 -0
- package/src/config/manager.ts +77 -0
- package/src/config/types.ts +25 -0
- package/src/index.ts +86 -0
- package/src/permissions/index.ts +7 -0
- package/src/permissions/manager.ts +97 -0
- package/src/permissions/types.ts +29 -0
- package/src/providers/anthropic.ts +224 -0
- package/src/providers/gemini.ts +295 -0
- package/src/providers/index.ts +97 -0
- package/src/providers/openai.ts +261 -0
- package/src/providers/types.ts +181 -0
- package/src/session/index.ts +6 -0
- package/src/session/manager.ts +354 -0
- package/src/session/types.ts +49 -0
- package/src/tools/builtin/bash.ts +92 -0
- package/src/tools/builtin/edit.ts +37 -0
- package/src/tools/builtin/glob.ts +42 -0
- package/src/tools/builtin/grep.ts +67 -0
- package/src/tools/builtin/read.ts +34 -0
- package/src/tools/builtin/write.ts +27 -0
- package/src/tools/index.ts +36 -0
- package/src/tools/registry.ts +83 -0
- package/src/tools/types.ts +172 -0
- package/tsconfig.json +21 -0
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
# Proposal: Multi-Provider Enhancements
|
|
2
|
+
|
|
3
|
+
- **Proposal ID**: 0040
|
|
4
|
+
- **Author**: mycode team
|
|
5
|
+
- **Status**: Draft
|
|
6
|
+
- **Created**: 2025-01-15
|
|
7
|
+
- **Updated**: 2025-01-15
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
Enhance the multi-provider system with unified tool calling, provider fallbacks, automatic model selection, and cross-provider consistency for seamless switching between LLM providers.
|
|
12
|
+
|
|
13
|
+
## Motivation
|
|
14
|
+
|
|
15
|
+
Current multi-provider support is basic:
|
|
16
|
+
|
|
17
|
+
1. **Inconsistent tool calling**: Different formats per provider
|
|
18
|
+
2. **No fallbacks**: Single point of failure
|
|
19
|
+
3. **Manual selection**: User must choose provider
|
|
20
|
+
4. **Feature gaps**: Not all features on all providers
|
|
21
|
+
5. **No cost optimization**: Can't auto-select cheapest
|
|
22
|
+
|
|
23
|
+
Enhanced multi-provider enables robust, flexible LLM usage.
|
|
24
|
+
|
|
25
|
+
## Detailed Design
|
|
26
|
+
|
|
27
|
+
### API Design
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// src/providers/types.ts
|
|
31
|
+
interface ProviderConfig {
|
|
32
|
+
name: string;
|
|
33
|
+
enabled: boolean;
|
|
34
|
+
priority: number; // Lower = higher priority
|
|
35
|
+
models: ModelConfig[];
|
|
36
|
+
rateLimits?: RateLimitConfig;
|
|
37
|
+
fallbackTo?: string; // Fallback provider
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface ModelConfig {
|
|
41
|
+
id: string;
|
|
42
|
+
aliases: string[];
|
|
43
|
+
capabilities: ModelCapability[];
|
|
44
|
+
contextWindow: number;
|
|
45
|
+
maxOutputTokens: number;
|
|
46
|
+
inputPricePer1M: number;
|
|
47
|
+
outputPricePer1M: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type ModelCapability =
|
|
51
|
+
| 'text'
|
|
52
|
+
| 'vision'
|
|
53
|
+
| 'tools'
|
|
54
|
+
| 'streaming'
|
|
55
|
+
| 'thinking'
|
|
56
|
+
| 'json_mode';
|
|
57
|
+
|
|
58
|
+
interface ProviderSelector {
|
|
59
|
+
strategy: 'priority' | 'round_robin' | 'cost_optimized' | 'latency_optimized';
|
|
60
|
+
requirements?: {
|
|
61
|
+
capabilities?: ModelCapability[];
|
|
62
|
+
minContextWindow?: number;
|
|
63
|
+
maxCostPer1K?: number;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface ProviderResult<T> {
|
|
68
|
+
provider: string;
|
|
69
|
+
model: string;
|
|
70
|
+
result: T;
|
|
71
|
+
usage?: TokenUsage;
|
|
72
|
+
latency: number;
|
|
73
|
+
fallbackUsed: boolean;
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Unified Provider Manager
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// src/providers/manager.ts
|
|
81
|
+
class ProviderManager {
|
|
82
|
+
private providers: Map<string, LLMProvider> = new Map();
|
|
83
|
+
private configs: Map<string, ProviderConfig> = new Map();
|
|
84
|
+
private healthStatus: Map<string, ProviderHealth> = new Map();
|
|
85
|
+
|
|
86
|
+
constructor() {
|
|
87
|
+
this.loadProviders();
|
|
88
|
+
this.startHealthChecks();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
async complete(
|
|
92
|
+
request: CompletionRequest,
|
|
93
|
+
selector?: ProviderSelector
|
|
94
|
+
): Promise<ProviderResult<CompletionResponse>> {
|
|
95
|
+
const provider = await this.selectProvider(request, selector);
|
|
96
|
+
|
|
97
|
+
const start = Date.now();
|
|
98
|
+
let fallbackUsed = false;
|
|
99
|
+
|
|
100
|
+
try {
|
|
101
|
+
const result = await provider.complete(request);
|
|
102
|
+
return {
|
|
103
|
+
provider: provider.name,
|
|
104
|
+
model: request.model,
|
|
105
|
+
result,
|
|
106
|
+
usage: result.usage,
|
|
107
|
+
latency: Date.now() - start,
|
|
108
|
+
fallbackUsed
|
|
109
|
+
};
|
|
110
|
+
} catch (error) {
|
|
111
|
+
// Try fallback
|
|
112
|
+
const fallback = await this.getFallback(provider.name, request);
|
|
113
|
+
if (fallback) {
|
|
114
|
+
fallbackUsed = true;
|
|
115
|
+
const result = await fallback.complete(request);
|
|
116
|
+
return {
|
|
117
|
+
provider: fallback.name,
|
|
118
|
+
model: request.model,
|
|
119
|
+
result,
|
|
120
|
+
usage: result.usage,
|
|
121
|
+
latency: Date.now() - start,
|
|
122
|
+
fallbackUsed
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private async selectProvider(
|
|
130
|
+
request: CompletionRequest,
|
|
131
|
+
selector?: ProviderSelector
|
|
132
|
+
): Promise<LLMProvider> {
|
|
133
|
+
const strategy = selector?.strategy || 'priority';
|
|
134
|
+
const requirements = selector?.requirements || {};
|
|
135
|
+
|
|
136
|
+
// Get eligible providers
|
|
137
|
+
const eligible = Array.from(this.providers.entries())
|
|
138
|
+
.filter(([name, provider]) => {
|
|
139
|
+
const config = this.configs.get(name);
|
|
140
|
+
if (!config?.enabled) return false;
|
|
141
|
+
|
|
142
|
+
// Check health
|
|
143
|
+
const health = this.healthStatus.get(name);
|
|
144
|
+
if (health?.status === 'unhealthy') return false;
|
|
145
|
+
|
|
146
|
+
// Check capabilities
|
|
147
|
+
if (requirements.capabilities) {
|
|
148
|
+
const model = this.findModel(config, request.model);
|
|
149
|
+
if (!model) return false;
|
|
150
|
+
const hasAll = requirements.capabilities.every(c =>
|
|
151
|
+
model.capabilities.includes(c)
|
|
152
|
+
);
|
|
153
|
+
if (!hasAll) return false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return true;
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
if (eligible.length === 0) {
|
|
160
|
+
throw new Error('No eligible providers available');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Select based on strategy
|
|
164
|
+
switch (strategy) {
|
|
165
|
+
case 'priority':
|
|
166
|
+
eligible.sort((a, b) => {
|
|
167
|
+
const priorityA = this.configs.get(a[0])?.priority || 999;
|
|
168
|
+
const priorityB = this.configs.get(b[0])?.priority || 999;
|
|
169
|
+
return priorityA - priorityB;
|
|
170
|
+
});
|
|
171
|
+
return eligible[0][1];
|
|
172
|
+
|
|
173
|
+
case 'cost_optimized':
|
|
174
|
+
return this.selectCheapest(eligible, request);
|
|
175
|
+
|
|
176
|
+
case 'latency_optimized':
|
|
177
|
+
return this.selectFastest(eligible);
|
|
178
|
+
|
|
179
|
+
case 'round_robin':
|
|
180
|
+
return this.selectRoundRobin(eligible);
|
|
181
|
+
|
|
182
|
+
default:
|
|
183
|
+
return eligible[0][1];
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
private selectCheapest(
|
|
188
|
+
providers: [string, LLMProvider][],
|
|
189
|
+
request: CompletionRequest
|
|
190
|
+
): LLMProvider {
|
|
191
|
+
const estimatedTokens = this.estimateTokens(request);
|
|
192
|
+
|
|
193
|
+
let cheapest: LLMProvider | null = null;
|
|
194
|
+
let lowestCost = Infinity;
|
|
195
|
+
|
|
196
|
+
for (const [name, provider] of providers) {
|
|
197
|
+
const config = this.configs.get(name);
|
|
198
|
+
const model = this.findModel(config!, request.model);
|
|
199
|
+
if (!model) continue;
|
|
200
|
+
|
|
201
|
+
const cost = (estimatedTokens.input * model.inputPricePer1M / 1_000_000) +
|
|
202
|
+
(estimatedTokens.output * model.outputPricePer1M / 1_000_000);
|
|
203
|
+
|
|
204
|
+
if (cost < lowestCost) {
|
|
205
|
+
lowestCost = cost;
|
|
206
|
+
cheapest = provider;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return cheapest || providers[0][1];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Tool calling normalization
|
|
214
|
+
normalizeToolCall(call: ProviderToolCall): UnifiedToolCall {
|
|
215
|
+
// Convert provider-specific format to unified format
|
|
216
|
+
return {
|
|
217
|
+
id: call.id || generateId(),
|
|
218
|
+
name: call.name || call.function?.name,
|
|
219
|
+
input: call.input || JSON.parse(call.function?.arguments || '{}')
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
normalizeToolResult(result: ToolResult, provider: string): ProviderToolResult {
|
|
224
|
+
// Convert unified result to provider-specific format
|
|
225
|
+
switch (provider) {
|
|
226
|
+
case 'anthropic':
|
|
227
|
+
return {
|
|
228
|
+
type: 'tool_result',
|
|
229
|
+
tool_use_id: result.id,
|
|
230
|
+
content: result.success ? result.output : `Error: ${result.error}`
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
case 'openai':
|
|
234
|
+
return {
|
|
235
|
+
role: 'tool',
|
|
236
|
+
tool_call_id: result.id,
|
|
237
|
+
content: result.success ? result.output : `Error: ${result.error}`
|
|
238
|
+
};
|
|
239
|
+
|
|
240
|
+
case 'gemini':
|
|
241
|
+
return {
|
|
242
|
+
functionResponse: {
|
|
243
|
+
name: result.name,
|
|
244
|
+
response: { result: result.success ? result.output : result.error }
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
default:
|
|
249
|
+
throw new Error(`Unknown provider: ${provider}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Health monitoring
|
|
254
|
+
private startHealthChecks(): void {
|
|
255
|
+
setInterval(async () => {
|
|
256
|
+
for (const [name, provider] of this.providers) {
|
|
257
|
+
try {
|
|
258
|
+
const start = Date.now();
|
|
259
|
+
await provider.complete({
|
|
260
|
+
messages: [{ role: 'user', content: 'ping' }],
|
|
261
|
+
maxTokens: 5
|
|
262
|
+
});
|
|
263
|
+
this.healthStatus.set(name, {
|
|
264
|
+
status: 'healthy',
|
|
265
|
+
latency: Date.now() - start,
|
|
266
|
+
lastCheck: new Date()
|
|
267
|
+
});
|
|
268
|
+
} catch (error) {
|
|
269
|
+
const current = this.healthStatus.get(name);
|
|
270
|
+
this.healthStatus.set(name, {
|
|
271
|
+
status: current?.status === 'degraded' ? 'unhealthy' : 'degraded',
|
|
272
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
273
|
+
lastCheck: new Date()
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}, 60000); // Check every minute
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
export const providerManager = new ProviderManager();
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### File Changes
|
|
285
|
+
|
|
286
|
+
| File | Action | Description |
|
|
287
|
+
|------|--------|-------------|
|
|
288
|
+
| `src/providers/types.ts` | Modify | Enhanced types |
|
|
289
|
+
| `src/providers/manager.ts` | Create | Provider management |
|
|
290
|
+
| `src/providers/selector.ts` | Create | Selection strategies |
|
|
291
|
+
| `src/providers/normalizer.ts` | Create | Format normalization |
|
|
292
|
+
| `src/providers/health.ts` | Create | Health monitoring |
|
|
293
|
+
|
|
294
|
+
## User Experience
|
|
295
|
+
|
|
296
|
+
### Provider Status
|
|
297
|
+
```
|
|
298
|
+
User: /providers
|
|
299
|
+
|
|
300
|
+
Provider Status:
|
|
301
|
+
┌────────────────────────────────────────────────────────────┐
|
|
302
|
+
│ Provider Status Latency Models Priority │
|
|
303
|
+
├────────────────────────────────────────────────────────────┤
|
|
304
|
+
│ anthropic ● Healthy 120ms claude-* 1 │
|
|
305
|
+
│ openai ● Healthy 95ms gpt-4*, o1 2 │
|
|
306
|
+
│ gemini ○ Degraded 450ms gemini-* 3 │
|
|
307
|
+
└────────────────────────────────────────────────────────────┘
|
|
308
|
+
|
|
309
|
+
Active: anthropic (claude-sonnet-4)
|
|
310
|
+
Fallback: openai (gpt-4o)
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
### Automatic Fallback
|
|
314
|
+
```
|
|
315
|
+
Agent: Attempting to connect to anthropic...
|
|
316
|
+
⚠️ anthropic unavailable, falling back to openai
|
|
317
|
+
|
|
318
|
+
Using: openai/gpt-4o
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Cost-Optimized Selection
|
|
322
|
+
```
|
|
323
|
+
User: /settings provider strategy cost_optimized
|
|
324
|
+
|
|
325
|
+
Provider strategy set to: Cost Optimized
|
|
326
|
+
|
|
327
|
+
For your typical usage:
|
|
328
|
+
• Small queries → gemini-2.0-flash ($0.0001/1K)
|
|
329
|
+
• Complex tasks → claude-sonnet ($0.003/1K)
|
|
330
|
+
• Vision tasks → gpt-4o ($0.005/1K)
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
### Model Comparison
|
|
334
|
+
```
|
|
335
|
+
User: /compare-models "Explain async/await"
|
|
336
|
+
|
|
337
|
+
Model Comparison:
|
|
338
|
+
┌────────────────────────────────────────────────────────────┐
|
|
339
|
+
│ Model Tokens Cost Latency Quality │
|
|
340
|
+
├────────────────────────────────────────────────────────────┤
|
|
341
|
+
│ claude-opus-4-5 1,234 $0.093 2.3s ★★★★★ │
|
|
342
|
+
│ claude-sonnet-4 892 $0.027 1.1s ★★★★☆ │
|
|
343
|
+
│ gpt-4o 756 $0.019 0.9s ★★★★☆ │
|
|
344
|
+
│ gemini-2.0-flash 645 $0.002 0.4s ★★★☆☆ │
|
|
345
|
+
└────────────────────────────────────────────────────────────┘
|
|
346
|
+
```
|
|
347
|
+
|
|
348
|
+
## Security Considerations
|
|
349
|
+
|
|
350
|
+
1. API key isolation per provider
|
|
351
|
+
2. Secure credential storage
|
|
352
|
+
3. No cross-provider data leakage
|
|
353
|
+
4. Rate limit enforcement
|
|
354
|
+
5. Audit logging per provider
|
|
355
|
+
|
|
356
|
+
## Migration Path
|
|
357
|
+
|
|
358
|
+
1. **Phase 1**: Unified tool calling
|
|
359
|
+
2. **Phase 2**: Provider fallbacks
|
|
360
|
+
3. **Phase 3**: Selection strategies
|
|
361
|
+
4. **Phase 4**: Health monitoring
|
|
362
|
+
5. **Phase 5**: Cost optimization
|
|
363
|
+
|
|
364
|
+
## References
|
|
365
|
+
|
|
366
|
+
- [Anthropic API](https://docs.anthropic.com/claude/reference)
|
|
367
|
+
- [OpenAI API](https://platform.openai.com/docs/api-reference)
|
|
368
|
+
- [Google AI API](https://ai.google.dev/docs)
|
|
369
|
+
- [LiteLLM](https://github.com/BerriAI/litellm) - Multi-provider abstraction
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# mycode Enhancement Proposals
|
|
2
|
+
|
|
3
|
+
This directory contains enhancement proposals for the mycode project. Each proposal describes a feature inspired by Claude Code that we plan to implement.
|
|
4
|
+
|
|
5
|
+
## Proposal Process
|
|
6
|
+
|
|
7
|
+
1. **Draft**: Initial proposal written and submitted
|
|
8
|
+
2. **Under Review**: Community and maintainer review
|
|
9
|
+
3. **Accepted**: Approved for implementation
|
|
10
|
+
4. **Implemented**: Feature has been implemented
|
|
11
|
+
5. **Rejected**: Proposal was rejected with explanation
|
|
12
|
+
|
|
13
|
+
## Proposal Index
|
|
14
|
+
|
|
15
|
+
### P1 Priority - Core Features
|
|
16
|
+
|
|
17
|
+
| ID | Title | Status |
|
|
18
|
+
|----|-------|--------|
|
|
19
|
+
| [0001](./0001-web-fetch-tool.md) | WebFetch Tool | Draft |
|
|
20
|
+
| [0002](./0002-web-search-tool.md) | WebSearch Tool | Draft |
|
|
21
|
+
| [0003](./0003-task-subagents.md) | Task Tool & Subagents | Draft |
|
|
22
|
+
| [0004](./0004-plan-mode.md) | Plan Mode | Draft |
|
|
23
|
+
| [0005](./0005-todo-system.md) | Todo System | Draft |
|
|
24
|
+
| [0006](./0006-memory-system.md) | Memory System (MYCODE.md) | Draft |
|
|
25
|
+
| [0007](./0007-context-management.md) | Context Management | Draft |
|
|
26
|
+
| [0008](./0008-checkpointing.md) | Checkpointing | Draft |
|
|
27
|
+
| [0009](./0009-hooks-system.md) | Hooks System | Draft |
|
|
28
|
+
| [0010](./0010-mcp-integration.md) | MCP Integration | Draft |
|
|
29
|
+
| [0011](./0011-custom-commands.md) | Custom Commands | Draft |
|
|
30
|
+
| [0012](./0012-ask-user-question.md) | AskUserQuestion Tool | Draft |
|
|
31
|
+
|
|
32
|
+
### P2 Priority - Enhanced Features
|
|
33
|
+
|
|
34
|
+
| ID | Title | Status |
|
|
35
|
+
|----|-------|--------|
|
|
36
|
+
| [0013](./0013-multi-edit-tool.md) | MultiEdit Tool | Draft |
|
|
37
|
+
| [0014](./0014-lsp-tool.md) | LSP Tool | Draft |
|
|
38
|
+
| [0015](./0015-ls-tool.md) | LS Tool | Draft |
|
|
39
|
+
| [0016](./0016-kill-shell-tool.md) | KillShell Tool | Draft |
|
|
40
|
+
| [0017](./0017-background-tasks.md) | Background Tasks | Draft |
|
|
41
|
+
| [0018](./0018-parallel-tool-execution.md) | Parallel Tool Execution | Draft |
|
|
42
|
+
| [0019](./0019-session-enhancements.md) | Session Enhancements | Draft |
|
|
43
|
+
| [0020](./0020-session-summarization.md) | Session Summarization | Draft |
|
|
44
|
+
| [0021](./0021-skills-system.md) | Skills System | Draft |
|
|
45
|
+
| [0022](./0022-plugin-system.md) | Plugin System | Draft |
|
|
46
|
+
| [0023](./0023-permission-enhancements.md) | Permission Enhancements | Draft |
|
|
47
|
+
| [0024](./0024-keyboard-shortcuts.md) | Keyboard Shortcuts | Draft |
|
|
48
|
+
| [0025](./0025-cost-tracking.md) | Cost Tracking | Draft |
|
|
49
|
+
| [0026](./0026-git-integration.md) | Git Integration | Draft |
|
|
50
|
+
| [0027](./0027-enhanced-read-tool.md) | Enhanced Read Tool | Draft |
|
|
51
|
+
| [0028](./0028-enhanced-bash-tool.md) | Enhanced Bash Tool | Draft |
|
|
52
|
+
|
|
53
|
+
### P3 Priority - Advanced Features
|
|
54
|
+
|
|
55
|
+
| ID | Title | Status |
|
|
56
|
+
|----|-------|--------|
|
|
57
|
+
| [0029](./0029-notebook-edit-tool.md) | NotebookEdit Tool | Draft |
|
|
58
|
+
| [0030](./0030-plugin-marketplace.md) | Plugin Marketplace | Draft |
|
|
59
|
+
| [0031](./0031-command-suggestions.md) | Command Suggestions | Draft |
|
|
60
|
+
| [0032](./0032-ide-integrations.md) | IDE Integrations | Draft |
|
|
61
|
+
| [0033](./0033-enterprise-deployment.md) | Enterprise Deployment | Draft |
|
|
62
|
+
| [0034](./0034-sandboxing.md) | Sandboxing | Draft |
|
|
63
|
+
| [0035](./0035-auto-updater.md) | Auto-updater | Draft |
|
|
64
|
+
| [0036](./0036-enhanced-glob-tool.md) | Enhanced Glob Tool | Draft |
|
|
65
|
+
| [0037](./0037-enhanced-grep-tool.md) | Enhanced Grep Tool | Draft |
|
|
66
|
+
| [0038](./0038-interactive-cli-ui.md) | Interactive CLI UI | Draft |
|
|
67
|
+
| [0039](./0039-streaming-enhancements.md) | Streaming Enhancements | Draft |
|
|
68
|
+
| [0040](./0040-multi-provider-enhancements.md) | Multi-Provider Enhancements | Draft |
|
|
69
|
+
|
|
70
|
+
## Research
|
|
71
|
+
|
|
72
|
+
Background research on Claude Code's implementation is documented in [research/](./research/):
|
|
73
|
+
|
|
74
|
+
- [claude-code-research.md](./research/claude-code-research.md) - Comprehensive research on Claude Code's memory, context, and session systems
|
|
75
|
+
|
|
76
|
+
## Writing a Proposal
|
|
77
|
+
|
|
78
|
+
Use [TEMPLATE.md](./TEMPLATE.md) as a starting point for new proposals.
|
|
79
|
+
|
|
80
|
+
## References
|
|
81
|
+
|
|
82
|
+
- [Claude Code Official Docs](https://code.claude.com/docs/en/overview)
|
|
83
|
+
- [Claude Code GitHub](https://github.com/anthropics/claude-code)
|
|
84
|
+
- [Claude Code Best Practices](https://www.anthropic.com/engineering/claude-code-best-practices)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Proposal: [Feature Name]
|
|
2
|
+
|
|
3
|
+
- **Proposal ID**: NNNN
|
|
4
|
+
- **Author**: [Name]
|
|
5
|
+
- **Status**: Draft | Under Review | Accepted | Implemented | Rejected
|
|
6
|
+
- **Created**: YYYY-MM-DD
|
|
7
|
+
- **Updated**: YYYY-MM-DD
|
|
8
|
+
|
|
9
|
+
## Summary
|
|
10
|
+
|
|
11
|
+
[One paragraph describing the feature]
|
|
12
|
+
|
|
13
|
+
## Motivation
|
|
14
|
+
|
|
15
|
+
[Why this feature is needed, what problems it solves]
|
|
16
|
+
|
|
17
|
+
## Claude Code Reference
|
|
18
|
+
|
|
19
|
+
[How this feature works in Claude Code, with examples]
|
|
20
|
+
|
|
21
|
+
## Detailed Design
|
|
22
|
+
|
|
23
|
+
### API Design
|
|
24
|
+
|
|
25
|
+
[Interfaces, types, function signatures]
|
|
26
|
+
|
|
27
|
+
### Implementation Approach
|
|
28
|
+
|
|
29
|
+
[Technical implementation details]
|
|
30
|
+
|
|
31
|
+
### File Changes
|
|
32
|
+
|
|
33
|
+
[List of files to be created/modified]
|
|
34
|
+
|
|
35
|
+
## User Experience
|
|
36
|
+
|
|
37
|
+
[How users will interact with this feature]
|
|
38
|
+
|
|
39
|
+
## Alternatives Considered
|
|
40
|
+
|
|
41
|
+
[Other approaches that were considered]
|
|
42
|
+
|
|
43
|
+
## Security Considerations
|
|
44
|
+
|
|
45
|
+
[Security implications if any]
|
|
46
|
+
|
|
47
|
+
## Testing Strategy
|
|
48
|
+
|
|
49
|
+
[How to test this feature]
|
|
50
|
+
|
|
51
|
+
## Migration Path
|
|
52
|
+
|
|
53
|
+
[How to migrate from current state]
|
|
54
|
+
|
|
55
|
+
## References
|
|
56
|
+
|
|
57
|
+
[Links to Claude Code docs, related proposals, etc.]
|