diff options
| author | soryu <soryu@soryu.co> | 2026-05-17 21:23:20 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-17 21:23:20 +0100 |
| commit | 0d996cf7590e3e52f424859c7d6f0e68640f119e (patch) | |
| tree | 0f3898d9e2e2a3c312358dbf70c44f4ab1cf3648 /makima/src/llm/groq.rs | |
| parent | ce29ae801bcc5a0ba76d5a8d1565242ab267a47d (diff) | |
| download | soryu-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.rs | 177 |
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, - }) - } -} |
