summaryrefslogtreecommitdiff
path: root/makima/src/llm/groq.rs
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-05-17 21:23:20 +0100
committerGitHub <noreply@github.com>2026-05-17 21:23:20 +0100
commit0d996cf7590e3e52f424859c7d6f0e68640f119e (patch)
tree0f3898d9e2e2a3c312358dbf70c44f4ab1cf3648 /makima/src/llm/groq.rs
parentce29ae801bcc5a0ba76d5a8d1565242ab267a47d (diff)
downloadsoryu-0d996cf7590e3e52f424859c7d6f0e68640f119e.tar.gz
soryu-0d996cf7590e3e52f424859c7d6f0e68640f119e.zip
chore: remove LLM module + all dependent surfaces (#135)
Wholesale removal of the LLM integration layer. ~14,200 LOC deleted across backend and frontend. All chat-driven UIs go with it. ## Backend - Delete `src/llm/` (7,400 LOC): claude/groq clients, contract_tools, contract_evaluator, discuss_tools, mesh_tools, phase_guidance, task_output, templates, markdown round-trip, tools, transcript_analyzer. - Delete handlers wholly dependent on LLM: - `chat.rs` (file-level LLM chat at /files/{id}/chat) - `mesh_chat.rs` (mesh & task LLM chat + history) - `templates.rs` (/contract-types listing) - Strip LLM uses from `mesh_daemon.rs`: - `compute_action_directive` (used phase_guidance::check_deliverables_met to nudge supervisors with "all tasks done" messages). The auto-PR path below still fires when all tasks finish, so no behaviour lost. - `crate::llm::markdown_to_body` → inline 1-line replacement that wraps markdown content in a single BodyElement::Markdown. The editor re-parses on display, so round-trip is preserved. - Drop routes: /files/{id}/chat, /mesh/chat, /mesh/chat/history, /mesh/tasks/{id}/chat, /contract-types. - Drop the matching openapi registrations. ## Frontend - Delete components that were LLM-only: - `mesh/UnifiedMeshChatInput.tsx` - `listen/DiscussContractModal.tsx` - `listen/TranscriptAnalysisPanel.tsx` - `listen/ContractPickerModal.tsx` - `files/CliInput.tsx` - Delete the entire /listen page (its primary value-add was voice → LLM analysis → contract creation; without LLM the page is just a transcript display with no obvious user purpose). - Delete `hooks/useMeshChatHistory.ts` and `lib/listenApi.ts` (transcript-analysis API client to the already-Phase-5-removed listen handlers). - Strip api.ts of LLM exports: LlmModel, ChatMessage/Request/Response, UserQuestion/Answer, chatWithFile, MeshChat* types & functions, getMeshChatHistory, clearMeshChatHistory, chatWithMeshContext, ContractTypeTemplate, listContractTypes, chatWithContract, getContractChatHistory, clearContractChatHistory, discussContract, PhaseDefinition, DeliverableDefinition. - mesh.tsx: drop UnifiedMeshChatInput render + the chatContext memo + handleTaskUpdatedFromCli (only consumer was the input). - files.tsx: drop CliInput render + handleGenerateFromElement + handleBodyUpdate + handleClearFocus + suggestedPrompt state (all CliInput-only). - NavStrip: drop the /listen link. - main.tsx: drop the /listen route. ## Net diff: 37 files changed, 58 insertions, 14,281 deletions. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Diffstat (limited to 'makima/src/llm/groq.rs')
-rw-r--r--makima/src/llm/groq.rs177
1 files changed, 0 insertions, 177 deletions
diff --git a/makima/src/llm/groq.rs b/makima/src/llm/groq.rs
deleted file mode 100644
index ee01fcf..0000000
--- a/makima/src/llm/groq.rs
+++ /dev/null
@@ -1,177 +0,0 @@
-//! Groq API client for LLM tool calling.
-
-use serde::{Deserialize, Serialize};
-use thiserror::Error;
-
-use super::tools::{Tool, ToolCall};
-
-const GROQ_API_URL: &str = "https://api.groq.com/openai/v1/chat/completions";
-const MODEL: &str = "moonshotai/kimi-k2-instruct-0905";
-
-#[derive(Debug, Error)]
-pub enum GroqError {
- #[error("HTTP request failed: {0}")]
- Request(#[from] reqwest::Error),
- #[error("API error: {0}")]
- Api(String),
- #[error("Missing API key")]
- MissingApiKey,
-}
-
-#[derive(Debug, Clone)]
-pub struct GroqClient {
- api_key: String,
- client: reqwest::Client,
-}
-
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct Message {
- pub role: String,
- pub content: Option<String>,
- #[serde(skip_serializing_if = "Option::is_none")]
- pub tool_calls: Option<Vec<ToolCallResponse>>,
- #[serde(skip_serializing_if = "Option::is_none")]
- pub tool_call_id: Option<String>,
-}
-
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct ToolCallResponse {
- pub id: String,
- #[serde(rename = "type")]
- pub call_type: String,
- pub function: FunctionCall,
-}
-
-#[derive(Debug, Clone, Serialize, Deserialize)]
-pub struct FunctionCall {
- pub name: String,
- pub arguments: String,
-}
-
-#[derive(Debug, Serialize)]
-struct ChatRequest {
- model: String,
- messages: Vec<Message>,
- tools: Vec<ToolDefinition>,
- tool_choice: String,
-}
-
-#[derive(Debug, Serialize)]
-struct ToolDefinition {
- #[serde(rename = "type")]
- tool_type: String,
- function: FunctionDefinition,
-}
-
-#[derive(Debug, Serialize)]
-struct FunctionDefinition {
- name: String,
- description: String,
- parameters: serde_json::Value,
-}
-
-#[derive(Debug, Deserialize)]
-struct ChatResponse {
- choices: Vec<Choice>,
-}
-
-#[derive(Debug, Deserialize)]
-struct Choice {
- message: MessageResponse,
- finish_reason: String,
-}
-
-#[derive(Debug, Deserialize)]
-struct MessageResponse {
- role: String,
- content: Option<String>,
- tool_calls: Option<Vec<ToolCallResponse>>,
-}
-
-#[derive(Debug)]
-pub struct ChatResult {
- pub content: Option<String>,
- pub tool_calls: Vec<ToolCall>,
- /// Raw tool call responses for including in subsequent messages
- pub raw_tool_calls: Vec<ToolCallResponse>,
- pub finish_reason: String,
-}
-
-impl GroqClient {
- pub fn new(api_key: String) -> Self {
- Self {
- api_key,
- client: reqwest::Client::new(),
- }
- }
-
- pub fn from_env() -> Result<Self, GroqError> {
- let api_key = std::env::var("GROQ_API_KEY").map_err(|_| GroqError::MissingApiKey)?;
- Ok(Self::new(api_key))
- }
-
- pub async fn chat_with_tools(
- &self,
- messages: Vec<Message>,
- tools: &[Tool],
- ) -> Result<ChatResult, GroqError> {
- let tool_definitions: Vec<ToolDefinition> = tools
- .iter()
- .map(|t| ToolDefinition {
- tool_type: "function".to_string(),
- function: FunctionDefinition {
- name: t.name.clone(),
- description: t.description.clone(),
- parameters: t.parameters.clone(),
- },
- })
- .collect();
-
- let request = ChatRequest {
- model: MODEL.to_string(),
- messages,
- tools: tool_definitions,
- tool_choice: "auto".to_string(),
- };
-
- let response = self
- .client
- .post(GROQ_API_URL)
- .header("Authorization", format!("Bearer {}", self.api_key))
- .header("Content-Type", "application/json")
- .json(&request)
- .send()
- .await?;
-
- if !response.status().is_success() {
- let error_text = response.text().await.unwrap_or_default();
- return Err(GroqError::Api(error_text));
- }
-
- let chat_response: ChatResponse = response.json().await?;
-
- let choice = chat_response
- .choices
- .into_iter()
- .next()
- .ok_or_else(|| GroqError::Api("No choices in response".to_string()))?;
-
- let raw_tool_calls = choice.message.tool_calls.unwrap_or_default();
-
- let tool_calls = raw_tool_calls
- .iter()
- .map(|tc| ToolCall {
- id: tc.id.clone(),
- name: tc.function.name.clone(),
- arguments: serde_json::from_str(&tc.function.arguments).unwrap_or_default(),
- })
- .collect();
-
- Ok(ChatResult {
- content: choice.message.content,
- tool_calls,
- raw_tool_calls,
- finish_reason: choice.finish_reason,
- })
- }
-}