11import * as vscode from "vscode"
2- import { ApiHandlerOptions , PEARAI_URL , ModelInfo } from "../../shared/api"
3- import { AnthropicHandler } from "./anthropic"
4- import { DeepSeekHandler } from "./deepseek"
2+ import { ApiHandlerOptions , ModelInfo } from "../ ../../shared/api"
3+ import { AnthropicHandler } from ".. /anthropic"
4+ import { DeepSeekHandler } from ".. /deepseek"
55import Anthropic from "@anthropic-ai/sdk"
6- import { BaseProvider } from "./base-provider"
7- import { SingleCompletionHandler } from "../"
8- import { OpenRouterHandler } from "./openrouter"
9- import { GeminiHandler } from "./gemini"
10- import { OpenAiHandler } from "./openai"
6+ import { BaseProvider } from "../base-provider"
7+ import { SingleCompletionHandler } from "../.."
8+ import { OpenRouterHandler } from "../openrouter"
9+ import { GeminiHandler } from "../gemini"
10+ import { OpenAiHandler } from "../openai"
11+ import { PearAIGenericHandler } from "./pearaiGeneric"
12+ import { PEARAI_URL } from "../../../shared/pearaiApi"
1113
1214interface PearAiModelsResponse {
1315 models : {
@@ -20,7 +22,9 @@ interface PearAiModelsResponse {
2022}
2123
2224export class PearAiHandler extends BaseProvider implements SingleCompletionHandler {
23- private handler ! : AnthropicHandler | OpenAiHandler
25+ private handler ! : AnthropicHandler | PearAIGenericHandler
26+ private pearAiModelsResponse : PearAiModelsResponse | null = null
27+ private options : ApiHandlerOptions
2428
2529 constructor ( options : ApiHandlerOptions ) {
2630 super ( )
@@ -40,8 +44,9 @@ export class PearAiHandler extends BaseProvider implements SingleCompletionHandl
4044 } else {
4145 vscode . commands . executeCommand ( "pearai.checkPearAITokens" , undefined )
4246 }
47+ this . options = options
4348
44- this . handler = new OpenAiHandler ( {
49+ this . handler = new PearAIGenericHandler ( {
4550 ...options ,
4651 openAiBaseUrl : PEARAI_URL ,
4752 openAiApiKey : options . pearaiApiKey ,
@@ -64,8 +69,9 @@ export class PearAiHandler extends BaseProvider implements SingleCompletionHandl
6469 throw new Error ( `Failed to fetch models: ${ response . statusText } ` )
6570 }
6671 const data = ( await response . json ( ) ) as PearAiModelsResponse
72+ this . pearAiModelsResponse = data
6773 const underlyingModel = data . models [ modelId ] ?. underlyingModelUpdated || "claude-3-5-sonnet-20241022"
68- if ( underlyingModel . startsWith ( "claude" ) ) {
74+ if ( underlyingModel . startsWith ( "claude" ) || modelId . startsWith ( "anthropic/" ) ) {
6975 // Default to Claude
7076 this . handler = new AnthropicHandler ( {
7177 ...options ,
@@ -74,7 +80,7 @@ export class PearAiHandler extends BaseProvider implements SingleCompletionHandl
7480 apiModelId : underlyingModel ,
7581 } )
7682 } else {
77- this . handler = new OpenAiHandler ( {
83+ this . handler = new PearAIGenericHandler ( {
7884 ...options ,
7985 openAiBaseUrl : PEARAI_URL ,
8086 openAiApiKey : options . pearaiApiKey ,
@@ -91,14 +97,14 @@ export class PearAiHandler extends BaseProvider implements SingleCompletionHandl
9197 apiModelId : "claude-3-5-sonnet-20241022" ,
9298 } )
9399 }
94- } else if ( modelId . startsWith ( "claude" ) ) {
100+ } else if ( modelId . startsWith ( "claude" ) || modelId . startsWith ( "anthropic/" ) ) {
95101 this . handler = new AnthropicHandler ( {
96102 ...options ,
97103 apiKey : options . pearaiApiKey ,
98104 anthropicBaseUrl : PEARAI_URL ,
99105 } )
100106 } else {
101- this . handler = new OpenAiHandler ( {
107+ this . handler = new PearAIGenericHandler ( {
102108 ...options ,
103109 openAiBaseUrl : PEARAI_URL ,
104110 openAiApiKey : options . pearaiApiKey ,
@@ -108,22 +114,25 @@ export class PearAiHandler extends BaseProvider implements SingleCompletionHandl
108114 }
109115
110116 getModel ( ) : { id : string ; info : ModelInfo } {
111- console . dir ( this . handler )
112- const baseModel = this . handler . getModel ( )
113- return {
114- id : baseModel . id ,
115- info : {
116- ...baseModel . info ,
117- // Inherit all capabilities from the underlying model
118- supportsImages : baseModel . info . supportsImages ,
119- supportsComputerUse : baseModel . info . supportsComputerUse ,
120- supportsPromptCache : baseModel . info . supportsPromptCache ,
121- inputPrice : baseModel . info . inputPrice || 0 ,
122- outputPrice : baseModel . info . outputPrice || 0 ,
123- cacheWritesPrice : baseModel . info . cacheWritesPrice ? baseModel . info . cacheWritesPrice : undefined ,
124- cacheReadsPrice : baseModel . info . cacheReadsPrice ? baseModel . info . cacheReadsPrice : undefined ,
125- } ,
117+ if (
118+ this . pearAiModelsResponse &&
119+ this . options . apiModelId === "pearai-model" &&
120+ this . pearAiModelsResponse . models
121+ ) {
122+ const modelInfo = this . pearAiModelsResponse . models [ this . options . apiModelId ]
123+ if ( modelInfo ) {
124+ return {
125+ id : this . options . apiModelId ,
126+ info : {
127+ contextWindow : modelInfo . contextWindow || 4096 , // provide default or actual value
128+ supportsPromptCache : modelInfo . supportsPromptCaching || false , // provide default or actual value
129+ ...modelInfo ,
130+ } ,
131+ }
132+ }
126133 }
134+ const baseModel = this . handler . getModel ( )
135+ return baseModel
127136 }
128137
129138 async * createMessage ( systemPrompt : string , messages : any [ ] ) : AsyncGenerator < any > {
0 commit comments