diff --git a/examples/chat-ui/src/data/models.json b/examples/chat-ui/src/data/models.json index 5960a1c..d40234c 100644 --- a/examples/chat-ui/src/data/models.json +++ b/examples/chat-ui/src/data/models.json @@ -455,7 +455,7 @@ "id": "qwen/qwen3-32b", "name": "Qwen3 32B", "attachment": false, - "reasoning": false, + "reasoning": true, "temperature": true, "tool_call": true, "knowledge": "2024-11-08", diff --git a/examples/chat-ui/src/hooks/useModels.ts b/examples/chat-ui/src/hooks/useModels.ts index 1d24257..28d0809 100644 --- a/examples/chat-ui/src/hooks/useModels.ts +++ b/examples/chat-ui/src/hooks/useModels.ts @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react' -import { Model, providers, SupportedProvider, SUPPORTED_PROVIDERS, FAVORITES_KEY } from '../types/models' +import { Model, providers, SUPPORTED_PROVIDERS, FAVORITES_KEY } from '../types/models' // Load models data from generated JSON import modelsData from '../data/models.json' @@ -31,7 +31,6 @@ export function useModels() { contextLimit: modelData.limit.context, outputLimit: modelData.limit.output, cost: modelData.cost, - providerOptions: getProviderOptions(providerId, modelId), } allModels.push(model) } @@ -114,27 +113,3 @@ export function useModels() { getToolSupportingModels, } } - -// Helper function to get provider-specific options -function getProviderOptions(providerId: SupportedProvider, modelId: string) { - // Add any provider-specific options here - switch (providerId) { - case 'groq': - // Handle specific Groq model options - if (modelId === 'qwen/qwen3-32b') { - return { - groq: { - reasoningFormat: 'parsed', - }, - } - } - break - case 'anthropic': - // Handle specific Anthropic model options - break - case 'openrouter': - // Handle specific OpenRouter model options - break - } - return undefined -} diff --git a/examples/chat-ui/src/hooks/useStreamResponse.ts b/examples/chat-ui/src/hooks/useStreamResponse.ts index c80c1cd..dbfdec0 100644 --- a/examples/chat-ui/src/hooks/useStreamResponse.ts +++ b/examples/chat-ui/src/hooks/useStreamResponse.ts @@ -8,6 +8,7 @@ import { type Model } from '../types/models' import { getAuthHeaders } from '../utils/auth' import { type Tool } from 'use-mcp/react' import { useConversationUpdater } from './useConversationUpdater' +import { getProviderOptions } from '../utils/modelOptions.ts' // Type guard for messages with content const hasContent = (message: Message): message is UserMessage | AssistantMessage | SystemMessage => { @@ -166,7 +167,7 @@ export const useStreamResponse = ({ tools: Object.keys(aiTools).length > 0 ? aiTools : undefined, maxSteps: 5, // Allow up to 5 steps for tool calling abortSignal: controller.signal, - ...selectedModel.providerOptions, + providerOptions: getProviderOptions(selectedModel.provider.id, selectedModel.modelId), }) // Use fullStream to get all events including tool calls, results, and text @@ -229,19 +230,13 @@ export const useStreamResponse = ({ } else { console.warn('Tool call event missing toolName:', event) } - // @ts-expect-error I have no idea why this is suddenly failing... } else if (event.type === 'tool-result') { - // @ts-expect-error wat if (event.toolName && event.toolCallId) { newMessage = { role: 'tool-result', - // @ts-expect-error the toolName: event.toolName, - // @ts-expect-error actual toolArgs: event.args || {}, - // @ts-expect-error goddamn toolResult: event.result, - // @ts-expect-error fek callId: event.toolCallId, } scrollToBottom(true) diff --git a/examples/chat-ui/src/types/models.ts b/examples/chat-ui/src/types/models.ts index 6a58ce0..73c4d16 100644 --- a/examples/chat-ui/src/types/models.ts +++ b/examples/chat-ui/src/types/models.ts @@ -39,8 +39,6 @@ export interface Provider { oauth?: { authorizeUrl: string tokenUrl: string - clientId: string - scopes: string[] } } @@ -60,7 +58,6 @@ export interface Model { cache_read?: number cache_write?: number } - providerOptions?: any } export const providers: Record = { @@ -72,6 +69,10 @@ export const providers: Record = { documentationUrl: 'https://console.groq.com/docs', authType: 'apiKey', apiKeyHeader: 'Authorization', + // oauth: { + // authorizeUrl: 'http://localhost:3000/keys/request', + // tokenUrl: 'https://openrouter.ai/api/v1/auth/keys' + // }, }, anthropic: { id: 'anthropic', @@ -92,8 +93,6 @@ export const providers: Record = { oauth: { authorizeUrl: 'https://openrouter.ai/auth', tokenUrl: 'https://openrouter.ai/api/v1/auth/keys', - clientId: '', // OpenRouter doesn't use client_id - scopes: [], // OpenRouter doesn't use scopes }, }, } diff --git a/examples/chat-ui/src/utils/auth.ts b/examples/chat-ui/src/utils/auth.ts index 0b55c39..d476cfe 100644 --- a/examples/chat-ui/src/utils/auth.ts +++ b/examples/chat-ui/src/utils/auth.ts @@ -122,22 +122,16 @@ export async function beginOAuthFlow(providerId: SupportedProvider): Promise + if (!providerModels) return false + + const model = providerModels[modelId] + return model?.reasoning === true +} + +// Helper function to get provider-specific options +export function getProviderOptions(providerId: SupportedProvider, modelId: string): Record | undefined { + // Add any provider-specific options here + switch (providerId) { + case 'groq': + // Handle specific Groq model options - set reasoningFormat for all reasoning models + if (supportsReasoning(providerId, modelId)) { + return { + groq: { + reasoningFormat: 'parsed', + }, + } + } + break + case 'anthropic': + // Handle specific Anthropic model options + break + case 'openrouter': + // Handle specific OpenRouter model options + break + } + return undefined +} diff --git a/examples/chat-ui/src/utils/modelPreferences.ts b/examples/chat-ui/src/utils/modelPreferences.ts index 0475790..0a77658 100644 --- a/examples/chat-ui/src/utils/modelPreferences.ts +++ b/examples/chat-ui/src/utils/modelPreferences.ts @@ -1,32 +1,8 @@ -import { type Model, providers, type SupportedProvider } from '../types/models' +import { type Model, providers } from '../types/models' // Import models data directly import modelsData from '../data/models.json' -// Helper function to get provider-specific options -function getProviderOptions(providerId: SupportedProvider, modelId: string) { - // Add any provider-specific options here - switch (providerId) { - case 'groq': - // Handle specific Groq model options - if (modelId === 'qwen/qwen3-32b') { - return { - groq: { - reasoningFormat: 'parsed', - }, - } - } - break - case 'anthropic': - // Handle specific Anthropic model options - break - case 'openrouter': - // Handle specific OpenRouter model options - break - } - return undefined -} - const MODEL_PREFERENCE_KEY = 'aiChatTemplate_selectedModel' function getAvailableModels(): Model[] { @@ -47,7 +23,6 @@ function getAvailableModels(): Model[] { contextLimit: modelData.limit.context, outputLimit: modelData.limit.output, cost: modelData.cost, - providerOptions: getProviderOptions(providerId as any, modelId), } models.push(model) }