@@ -41,6 +41,7 @@ import VSCodeButtonLink from "../common/VSCodeButtonLink"
4141import OpenRouterModelPicker , { ModelDescriptionMarkdown } from "./OpenRouterModelPicker"
4242import styled from "styled-components"
4343import * as vscodemodels from "vscode"
44+ import { getAsVar , VSC_DESCRIPTION_FOREGROUND } from "../../utils/vscStyles"
4445
4546interface ApiOptionsProps {
4647 showModelOptions : boolean
@@ -80,6 +81,7 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
8081 const [ vsCodeLmModels , setVsCodeLmModels ] = useState < vscodemodels . LanguageModelChatSelector [ ] > ( [ ] )
8182 const [ anthropicBaseUrlSelected , setAnthropicBaseUrlSelected ] = useState ( ! ! apiConfiguration ?. anthropicBaseUrl )
8283 const [ azureApiVersionSelected , setAzureApiVersionSelected ] = useState ( ! ! apiConfiguration ?. azureApiVersion )
84+ const [ modelConfigurationSelected , setModelConfigurationSelected ] = useState ( false )
8385 const [ isDescriptionExpanded , setIsDescriptionExpanded ] = useState ( false )
8486
8587 const handleInputChange = ( field : keyof ApiConfiguration ) => ( event : any ) => {
@@ -694,6 +696,127 @@ const ApiOptions = ({ showModelOptions, apiErrorMessage, modelIdErrorMessage, is
694696 placeholder = { `Default: ${ azureOpenAiDefaultApiVersion } ` }
695697 />
696698 ) }
699+ < div
700+ style = { {
701+ color : getAsVar ( VSC_DESCRIPTION_FOREGROUND ) ,
702+ display : "flex" ,
703+ margin : "10px 0" ,
704+ cursor : "pointer" ,
705+ alignItems : "center" ,
706+ } }
707+ onClick = { ( ) => setModelConfigurationSelected ( ( val ) => ! val ) } >
708+ < span
709+ className = { `codicon ${ modelConfigurationSelected ? "codicon-chevron-down" : "codicon-chevron-right" } ` }
710+ style = { {
711+ marginRight : "4px" ,
712+ } } > </ span >
713+ < span
714+ style = { {
715+ fontWeight : 700 ,
716+ textTransform : "uppercase" ,
717+ } } >
718+ Model Configuration
719+ </ span >
720+ </ div >
721+ { modelConfigurationSelected && (
722+ < >
723+ < VSCodeCheckbox
724+ checked = { apiConfiguration ?. openAiModelInfo ?. supportsImages }
725+ onChange = { ( e : any ) => {
726+ const isChecked = e . target . checked === true
727+ let modelInfo = apiConfiguration ?. openAiModelInfo
728+ ? apiConfiguration . openAiModelInfo
729+ : { ...openAiModelInfoSaneDefaults }
730+ modelInfo . supportsImages = isChecked
731+ setApiConfiguration ( {
732+ ...apiConfiguration ,
733+ openAiModelInfo : modelInfo ,
734+ } )
735+ } } >
736+ Supports Images
737+ </ VSCodeCheckbox >
738+ < div style = { { display : "flex" , gap : 10 , marginTop : "5px" } } >
739+ < VSCodeTextField
740+ value = {
741+ apiConfiguration ?. openAiModelInfo ?. contextWindow
742+ ? apiConfiguration . openAiModelInfo . contextWindow . toString ( )
743+ : openAiModelInfoSaneDefaults . contextWindow ?. toString ( )
744+ }
745+ style = { { flex : 1 } }
746+ onInput = { ( input : any ) => {
747+ let modelInfo = apiConfiguration ?. openAiModelInfo
748+ ? apiConfiguration . openAiModelInfo
749+ : { ...openAiModelInfoSaneDefaults }
750+ modelInfo . contextWindow = Number ( input . target . value )
751+ setApiConfiguration ( {
752+ ...apiConfiguration ,
753+ openAiModelInfo : modelInfo ,
754+ } )
755+ } } >
756+ < span style = { { fontWeight : 500 } } > Context Window Size</ span >
757+ </ VSCodeTextField >
758+ < VSCodeTextField
759+ value = {
760+ apiConfiguration ?. openAiModelInfo ?. maxTokens
761+ ? apiConfiguration . openAiModelInfo . maxTokens . toString ( )
762+ : openAiModelInfoSaneDefaults . maxTokens ?. toString ( )
763+ }
764+ style = { { flex : 1 } }
765+ onInput = { ( input : any ) => {
766+ let modelInfo = apiConfiguration ?. openAiModelInfo
767+ ? apiConfiguration . openAiModelInfo
768+ : { ...openAiModelInfoSaneDefaults }
769+ modelInfo . maxTokens = input . target . value
770+ setApiConfiguration ( {
771+ ...apiConfiguration ,
772+ openAiModelInfo : modelInfo ,
773+ } )
774+ } } >
775+ < span style = { { fontWeight : 500 } } > Max Output Tokens</ span >
776+ </ VSCodeTextField >
777+ </ div >
778+ < div style = { { display : "flex" , gap : 10 , marginTop : "5px" } } >
779+ < VSCodeTextField
780+ value = {
781+ apiConfiguration ?. openAiModelInfo ?. inputPrice
782+ ? apiConfiguration . openAiModelInfo . inputPrice . toString ( )
783+ : openAiModelInfoSaneDefaults . inputPrice ?. toString ( )
784+ }
785+ style = { { flex : 1 } }
786+ onInput = { ( input : any ) => {
787+ let modelInfo = apiConfiguration ?. openAiModelInfo
788+ ? apiConfiguration . openAiModelInfo
789+ : { ...openAiModelInfoSaneDefaults }
790+ modelInfo . inputPrice = input . target . value
791+ setApiConfiguration ( {
792+ ...apiConfiguration ,
793+ openAiModelInfo : modelInfo ,
794+ } )
795+ } } >
796+ < span style = { { fontWeight : 500 } } > Input Price / 1M tokens</ span >
797+ </ VSCodeTextField >
798+ < VSCodeTextField
799+ value = {
800+ apiConfiguration ?. openAiModelInfo ?. outputPrice
801+ ? apiConfiguration . openAiModelInfo . outputPrice . toString ( )
802+ : openAiModelInfoSaneDefaults . outputPrice ?. toString ( )
803+ }
804+ style = { { flex : 1 } }
805+ onInput = { ( input : any ) => {
806+ let modelInfo = apiConfiguration ?. openAiModelInfo
807+ ? apiConfiguration . openAiModelInfo
808+ : { ...openAiModelInfoSaneDefaults }
809+ modelInfo . outputPrice = input . target . value
810+ setApiConfiguration ( {
811+ ...apiConfiguration ,
812+ openAiModelInfo : modelInfo ,
813+ } )
814+ } } >
815+ < span style = { { fontWeight : 500 } } > Output Price / 1M tokens</ span >
816+ </ VSCodeTextField >
817+ </ div >
818+ </ >
819+ ) }
697820 < p
698821 style = { {
699822 fontSize : "12px" ,
0 commit comments