/** * * Copyright 2023-present InspectorRAGet Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ 'use client'; import { useState } from 'react'; import { Select, SelectItem, TextInput, TextArea } from '@carbon/react'; import { Task, ToolDefinition, CommentFinding } from '@/src/types'; // =================================================================================== // TYPES // =================================================================================== interface Props { taskType?: Task['taskType']; tools?: ToolDefinition[]; value: CommentFinding | undefined; onChange: (finding: CommentFinding | undefined) => void; } // Finding types available per task type. 'note' is always included. const FINDING_OPTIONS: Record = { tool_calling: [ { id: 'tool_call', label: 'Tool call' }, { id: 'note', label: 'Note' }, ], rag: [ { id: 'query', label: 'Query' }, { id: 'note', label: 'Note' }, ], qa: [ { id: 'query', label: 'Query' }, { id: 'output', label: 'Output' }, { id: 'note', label: 'Note' }, ], generation: [ { id: 'output', label: 'Output' }, { id: 'note', label: 'Note' }, ], agentic: [{ id: 'note', label: 'Note' }], }; const DEFAULT_OPTIONS = [{ id: 'note', label: 'Note' }]; // =================================================================================== // MAIN FUNCTION // =================================================================================== export default function CommentFindingEditor({ taskType, tools, value, onChange, }: Props) { // Track whether the JSON arguments field contains invalid JSON so we can warn // without blocking submission. const [argsInvalid, setArgsInvalid] = useState(false); const options = taskType ? (FINDING_OPTIONS[taskType] ?? DEFAULT_OPTIONS) : DEFAULT_OPTIONS; function handleTypeChange(selectedType: string) { if (!selectedType) { onChange(undefined); return; } // Build the minimal valid shape for the chosen finding type. if (selectedType === 'tool_call') { onChange({ type: 'tool_call', functionName: '' }); } else if (selectedType === 'query') { onChange({ type: 'query', query: '' }); } else if (selectedType === 'output') { onChange({ type: 'output', output: '' }); } else { onChange({ type: 'note', text: '' }); } setArgsInvalid(false); } return (
{value?.type === 'tool_call' && ( <> {tools && tools.length > 0 ? ( ) : ( onChange({ ...value, functionName: e.target.value }) } /> )}