refactor(task-1): add domain layer with entities and interfaces
- Add entity types: Message, Tool, ToolCall, Chunk, Account - Add repository interfaces: AccountPool, Provider - Add usecase interfaces: ChatUsecase, AgentRunner - Add model constants and error definitions
This commit is contained in:
parent
8b6abbbba7
commit
294bd74a43
|
|
@ -0,0 +1,22 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
// Account represents an account in the pool
|
||||||
|
type Account struct {
|
||||||
|
ConfigDir string
|
||||||
|
ActiveRequests int
|
||||||
|
LastUsed int64
|
||||||
|
RateLimitUntil int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// AccountStat represents account statistics
|
||||||
|
type AccountStat struct {
|
||||||
|
ConfigDir string
|
||||||
|
ActiveRequests int
|
||||||
|
TotalRequests int
|
||||||
|
TotalSuccess int
|
||||||
|
TotalErrors int
|
||||||
|
TotalRateLimits int
|
||||||
|
TotalLatencyMs int64
|
||||||
|
IsRateLimited bool
|
||||||
|
RateLimitUntil int64
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
// ChunkType represents the type of stream chunk
|
||||||
|
type ChunkType int
|
||||||
|
|
||||||
|
const (
|
||||||
|
ChunkText ChunkType = iota
|
||||||
|
ChunkThinking
|
||||||
|
ChunkToolCall
|
||||||
|
ChunkDone
|
||||||
|
)
|
||||||
|
|
||||||
|
// StreamChunk represents a chunk in SSE streaming
|
||||||
|
type StreamChunk struct {
|
||||||
|
Type ChunkType
|
||||||
|
Text string
|
||||||
|
Thinking string
|
||||||
|
ToolCall *ToolCall
|
||||||
|
Done bool
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
package entity
|
||||||
|
|
||||||
|
// Message represents a chat message
|
||||||
|
type Message struct {
|
||||||
|
Role string
|
||||||
|
Content interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tool represents a tool definition
|
||||||
|
type Tool struct {
|
||||||
|
Type string
|
||||||
|
Function ToolFunction
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToolFunction represents a tool function definition
|
||||||
|
type ToolFunction struct {
|
||||||
|
Name string
|
||||||
|
Description string
|
||||||
|
Parameters interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToolCall represents a tool call result
|
||||||
|
type ToolCall struct {
|
||||||
|
ID string
|
||||||
|
Name string
|
||||||
|
Arguments string
|
||||||
|
}
|
||||||
|
|
||||||
|
// FunctionCall represents a function call
|
||||||
|
type FunctionCall struct {
|
||||||
|
Name string
|
||||||
|
Arguments string
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"cursor-api-proxy/pkg/domain/entity"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AccountPool defines the interface for account pool management
|
||||||
|
type AccountPool interface {
|
||||||
|
GetNextConfigDir() string
|
||||||
|
ReportRequestStart(configDir string)
|
||||||
|
ReportRequestEnd(configDir string)
|
||||||
|
ReportRequestSuccess(configDir string, latencyMs int64)
|
||||||
|
ReportRequestError(configDir string, latencyMs int64)
|
||||||
|
ReportRateLimit(configDir string, penaltyMs int64)
|
||||||
|
GetStats() []entity.AccountStat
|
||||||
|
Count() int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provider defines the interface for AI providers
|
||||||
|
type Provider interface {
|
||||||
|
Name() string
|
||||||
|
Generate(ctx context.Context, model string, messages []entity.Message,
|
||||||
|
tools []entity.Tool, callback func(entity.StreamChunk)) error
|
||||||
|
Close() error
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
var (
|
||||||
|
ErrInvalidRequest = errors.New("invalid request")
|
||||||
|
ErrProviderNotFound = errors.New("provider not found")
|
||||||
|
ErrAccountExhausted = errors.New("all accounts exhausted")
|
||||||
|
ErrRateLimited = errors.New("rate limited")
|
||||||
|
ErrTimeout = errors.New("request timeout")
|
||||||
|
ErrClientDisconnect = errors.New("client disconnected")
|
||||||
|
ErrAgentError = errors.New("agent execution error")
|
||||||
|
)
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
package types
|
||||||
|
|
||||||
|
// Model mappings for Cursor API
|
||||||
|
var AnthropicToCursor = map[string]string{
|
||||||
|
"claude-3-5-sonnet": "claude-3.5-sonnet",
|
||||||
|
"claude-3-5-sonnet-20241022": "claude-3.5-sonnet",
|
||||||
|
"claude-3-5-haiku": "claude-3.5-haiku",
|
||||||
|
"claude-3-opus": "claude-3-opus",
|
||||||
|
"claude-3-sonnet": "claude-3-sonnet",
|
||||||
|
"claude-3-haiku": "claude-3-haiku",
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cursor model aliases
|
||||||
|
var CursorModelAliases = []string{
|
||||||
|
"auto",
|
||||||
|
"claude-3.5-sonnet",
|
||||||
|
"claude-3.5-haiku",
|
||||||
|
"claude-3-opus",
|
||||||
|
"gpt-4",
|
||||||
|
"gpt-4o",
|
||||||
|
"gemini-2.0-flash",
|
||||||
|
}
|
||||||
|
|
||||||
|
// ResolveToCursorModel resolves a model name to Cursor model
|
||||||
|
func ResolveToCursorModel(model string) string {
|
||||||
|
if mapped, ok := AnthropicToCursor[model]; ok {
|
||||||
|
return mapped
|
||||||
|
}
|
||||||
|
return model
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
package usecase
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"cursor-api-proxy/pkg/domain/entity"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ChatUsecase defines the interface for chat operations
|
||||||
|
type ChatUsecase interface {
|
||||||
|
Execute(ctx context.Context, input ChatInput) (ChatOutput, error)
|
||||||
|
Stream(ctx context.Context, input ChatInput, callback func(entity.StreamChunk)) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChatInput represents the input for chat operations
|
||||||
|
type ChatInput struct {
|
||||||
|
Model string
|
||||||
|
Messages []entity.Message
|
||||||
|
Tools []entity.Tool
|
||||||
|
Stream bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChatOutput represents the output from chat operations
|
||||||
|
type ChatOutput struct {
|
||||||
|
Content string
|
||||||
|
Thinking string
|
||||||
|
ToolCalls []entity.ToolCall
|
||||||
|
}
|
||||||
|
|
||||||
|
// AgentRunner defines the interface for running AI agents
|
||||||
|
type AgentRunner interface {
|
||||||
|
RunSync(ctx context.Context, config interface{}, args []string) (RunResult, error)
|
||||||
|
RunStream(ctx context.Context, config interface{}, args []string, onLine func(string)) (StreamResult, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunResult represents the result of a synchronous agent run
|
||||||
|
type RunResult struct {
|
||||||
|
Code int
|
||||||
|
Stdout string
|
||||||
|
Stderr string
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamResult represents the result of a streaming agent run
|
||||||
|
type StreamResult struct {
|
||||||
|
Code int
|
||||||
|
Stderr string
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue