3.9 KiB
3.9 KiB
Test Plan: Input Construction
Feature description
Input encapsulates a single chat turn's data: text, files, role,
model, session context, RAG embeddings, and function declarations.
It's constructed at the start of each turn and captures all needed
state from RequestContext.
Behaviors to test
Input::from_str
- Creates Input from text string
- Captures role via resolve_role
- Captures session from ctx
- Captures rag from ctx (requires RAG setup)
- Captures functions via select_functions (tested separately)
- Captures stream_enabled from AppConfig
- app_config field set from ctx.app.config
- Empty text → is_empty() returns true
Input::from_files
- Loads file contents (async + filesystem)
- Supports multiple files (async + filesystem)
- Supports directories (recursive) (async + filesystem)
- Supports URLs (fetches content) (async + network)
- Supports loader syntax (e.g., jina:url) (async + loader)
- Last message carry-over (%% syntax) (via resolve_paths)
- Combines file content with text (async)
- document_loaders from AppConfig used (async)
resolve_role
- Returns provided role if given
- Extracts role from agent if agent active (requires agent init)
- Extracts role from session if session has role
- Returns default model-based role otherwise
- with_session flag set correctly
- with_agent flag set correctly
Input methods
- stream() returns stream_enabled && !model.no_stream() (requires Model with no_stream)
- create_client() uses app_config to init client (requires client config)
- prepare_completion_data() uses captured functions (requires Model)
- build_messages() uses captured session (requires Message setup)
- echo_messages() uses captured session (requires Message setup)
- set_regenerate(role) refreshes role
- use_embeddings() searches RAG if present (requires RAG)
- merge_tool_results() creates continuation input (requires ToolResult)
Context switching scenarios
- Input with agent → agent functions selected (requires agent init)
- Input with MCP → MCP meta functions in declarations (via select_functions tests)
- Input with RAG → embeddings included after use_embeddings (requires RAG)
- Input without session → no session messages in build_messages (via session() test)
Additional behaviors tested (not in original plan)
- resolve_role: explicit role overrides session flag
- resolve_paths: empty input
- resolve_paths: URL detection (https://)
- resolve_paths: external command detection (backtick syntax)
- resolve_paths: rejects URL with glob suffix
- resolve_paths: mixed inputs (%%, URL, external cmd)
- Input::set_text changes text
- Input::patched_text overrides text()
- Input::clear_patch restores original
- Input::set_continue_output accumulates
- Input::summary truncates long text with ...
- Input::summary preserves short text
- Input::raw() with no files
- Input::render() with no medias
- Input::session() returns None when with_session=false
- Input::session() returns Some when with_session=true
- is_image recognizes png/jpeg/jpg/webp/gif
- is_image rejects non-image extensions
- resolve_data_url returns path for known hash
- resolve_data_url returns original for non-data URL
- select_functions: None when no tools enabled
- select_functions: None when function_calling disabled
- select_functions: "all" returns all non-MCP
- select_functions: comma-separated filters
- select_enabled_mcp_servers: empty when MCP disabled
- select_enabled_mcp_servers: "all" returns all MCP functions
- select_enabled_mcp_servers: comma filters by server name
Old code reference
src/config/input.rs— Input struct, from_str, from_filessrc/config/mod.rs— select_functions, extract_role