Files
coyote/docs/restful-api/testing/plans/07-input-construction.md
T

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_files
  • src/config/mod.rs — select_functions, extract_role