This commit implements two major features: 1. Integration Search as Primary AI Data Source - Confluence, ServiceNow, and Azure DevOps searches execute before AI queries - Search results injected as system context for AI providers - Parallel search execution for performance - Webview-based fetch for HttpOnly cookie support - Persistent browser windows maintain authenticated sessions 2. AI Tool-Calling (Function Calling) - Allows AI to automatically execute functions during conversation - Implemented for OpenAI-compatible providers and Custom REST provider - Created add_ado_comment tool for updating Azure DevOps tickets - Iterative tool-calling loop supports multi-step workflows - Extensible architecture for adding new tools Key Files: - src-tauri/src/ai/tools.rs (NEW) - Tool definitions - src-tauri/src/integrations/*_search.rs (NEW) - Integration search modules - src-tauri/src/integrations/webview_fetch.rs (NEW) - HttpOnly cookie workaround - src-tauri/src/commands/ai.rs - Tool execution and integration search - src-tauri/src/ai/openai.rs - Tool-calling for OpenAI and Custom REST provider - All providers updated with tools parameter support Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
91 lines
2.4 KiB
Rust
91 lines
2.4 KiB
Rust
pub mod anthropic;
|
|
pub mod gemini;
|
|
pub mod mistral;
|
|
pub mod ollama;
|
|
pub mod openai;
|
|
pub mod provider;
|
|
pub mod tools;
|
|
|
|
pub use provider::*;
|
|
pub use tools::*;
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
use std::collections::HashMap;
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct Message {
|
|
pub role: String,
|
|
pub content: String,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub tool_call_id: Option<String>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub tool_calls: Option<Vec<ToolCall>>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct ChatResponse {
|
|
pub content: String,
|
|
pub model: String,
|
|
pub usage: Option<TokenUsage>,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
pub tool_calls: Option<Vec<ToolCall>>,
|
|
}
|
|
|
|
/// Represents a tool call made by the AI
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct ToolCall {
|
|
pub id: String,
|
|
pub name: String,
|
|
pub arguments: String, // JSON string
|
|
}
|
|
|
|
/// Tool definition that describes available functions to the AI
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct Tool {
|
|
pub name: String,
|
|
pub description: String,
|
|
pub parameters: ToolParameters,
|
|
}
|
|
|
|
/// JSON Schema-style parameter definition for tools
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct ToolParameters {
|
|
#[serde(rename = "type")]
|
|
pub param_type: String, // Usually "object"
|
|
pub properties: HashMap<String, ParameterProperty>,
|
|
pub required: Vec<String>,
|
|
}
|
|
|
|
/// Individual parameter property definition
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct ParameterProperty {
|
|
#[serde(rename = "type")]
|
|
pub prop_type: String, // "string", "number", "integer", "boolean"
|
|
pub description: String,
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
|
#[serde(rename = "enum")]
|
|
pub enum_values: Option<Vec<String>>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct TokenUsage {
|
|
pub prompt_tokens: u32,
|
|
pub completion_tokens: u32,
|
|
pub total_tokens: u32,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct AnalysisResult {
|
|
pub summary: String,
|
|
pub key_findings: Vec<String>,
|
|
pub suggested_why1: String,
|
|
pub severity_assessment: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct ProviderInfo {
|
|
pub name: String,
|
|
pub supports_streaming: bool,
|
|
pub models: Vec<String>,
|
|
}
|