diff --git a/llmx-rs/Cargo.lock b/llmx-rs/Cargo.lock index b21c7600..acd85674 100644 --- a/llmx-rs/Cargo.lock +++ b/llmx-rs/Cargo.lock @@ -178,7 +178,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "app_test_support" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -765,9 +765,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.51" +version = "4.5.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" +checksum = "aa8120877db0e5c011242f96806ce3c94e0737ab8108532a76a3300a01db2ab8" dependencies = [ "clap_builder", "clap_derive", @@ -775,9 +775,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.51" +version = "4.5.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" +checksum = "02576b399397b659c26064fbc92a75fede9d18ffd5f80ca1cd74ddab167016e1" dependencies = [ "anstream", "anstyle", @@ -952,7 +952,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core_test_support" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -2828,7 +2828,7 @@ checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "llmx-ansi-escape" -version = "0.1.7" +version = "0.1.8" dependencies = [ "ansi-to-tui", "ratatui", @@ -2837,7 +2837,7 @@ dependencies = [ [[package]] name = "llmx-app-server" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "app_test_support", @@ -2872,7 +2872,7 @@ dependencies = [ [[package]] name = "llmx-app-server-protocol" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "clap", @@ -2890,7 +2890,7 @@ dependencies = [ [[package]] name = "llmx-apply-patch" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -2905,7 +2905,7 @@ dependencies = [ [[package]] name = "llmx-arg0" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "dotenvy", @@ -2918,7 +2918,7 @@ dependencies = [ [[package]] name = "llmx-async-utils" -version = "0.1.7" +version = "0.1.8" dependencies = [ "async-trait", "pretty_assertions", @@ -2942,7 +2942,7 @@ dependencies = [ [[package]] name = "llmx-backend-openapi-models" -version = "0.1.7" +version = "0.1.8" dependencies = [ "serde", "serde_json", @@ -2951,7 +2951,7 @@ dependencies = [ [[package]] name = "llmx-chatgpt" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "clap", @@ -2966,7 +2966,7 @@ dependencies = [ [[package]] name = "llmx-cli" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -3006,7 +3006,7 @@ dependencies = [ [[package]] name = "llmx-cloud-tasks" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "async-trait", @@ -3032,7 +3032,7 @@ dependencies = [ [[package]] name = "llmx-cloud-tasks-client" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "async-trait", @@ -3047,7 +3047,7 @@ dependencies = [ [[package]] name = "llmx-common" -version = "0.1.7" +version = "0.1.8" dependencies = [ "clap", "llmx-app-server-protocol", @@ -3059,7 +3059,7 @@ dependencies = [ [[package]] name = "llmx-core" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "askama", @@ -3140,7 +3140,7 @@ dependencies = [ [[package]] name = "llmx-exec" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -3173,7 +3173,7 @@ dependencies = [ [[package]] name = "llmx-execpolicy" -version = "0.1.7" +version = "0.1.8" dependencies = [ "allocative", "anyhow", @@ -3193,7 +3193,7 @@ dependencies = [ [[package]] name = "llmx-feedback" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "llmx-protocol", @@ -3204,7 +3204,7 @@ dependencies = [ [[package]] name = "llmx-file-search" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "clap", @@ -3217,7 +3217,7 @@ dependencies = [ [[package]] name = "llmx-git" -version = "0.1.7" +version = "0.1.8" dependencies = [ "assert_matches", "once_cell", @@ -3233,7 +3233,7 @@ dependencies = [ [[package]] name = "llmx-keyring-store" -version = "0.1.7" +version = "0.1.8" dependencies = [ "keyring", "tracing", @@ -3241,7 +3241,7 @@ dependencies = [ [[package]] name = "llmx-linux-sandbox" -version = "0.1.7" +version = "0.1.8" dependencies = [ "clap", "landlock", @@ -3254,7 +3254,7 @@ dependencies = [ [[package]] name = "llmx-login" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "base64", @@ -3278,7 +3278,7 @@ dependencies = [ [[package]] name = "llmx-mcp-server" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -3305,7 +3305,7 @@ dependencies = [ [[package]] name = "llmx-ollama" -version = "0.1.7" +version = "0.1.8" dependencies = [ "assert_matches", "async-stream", @@ -3321,7 +3321,7 @@ dependencies = [ [[package]] name = "llmx-otel" -version = "0.1.7" +version = "0.1.8" dependencies = [ "chrono", "eventsource-stream", @@ -3342,14 +3342,14 @@ dependencies = [ [[package]] name = "llmx-process-hardening" -version = "0.1.7" +version = "0.1.8" dependencies = [ "libc", ] [[package]] name = "llmx-protocol" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "base64", @@ -3375,7 +3375,7 @@ dependencies = [ [[package]] name = "llmx-responses-api-proxy" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "clap", @@ -3391,7 +3391,7 @@ dependencies = [ [[package]] name = "llmx-rmcp-client" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "axum", @@ -3420,7 +3420,7 @@ dependencies = [ [[package]] name = "llmx-stdio-to-uds" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", @@ -3431,7 +3431,7 @@ dependencies = [ [[package]] name = "llmx-tui" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "arboard", @@ -3496,7 +3496,7 @@ dependencies = [ [[package]] name = "llmx-utils-cache" -version = "0.1.7" +version = "0.1.8" dependencies = [ "lru", "sha1", @@ -3505,7 +3505,7 @@ dependencies = [ [[package]] name = "llmx-utils-image" -version = "0.1.7" +version = "0.1.8" dependencies = [ "base64", "image", @@ -3517,7 +3517,7 @@ dependencies = [ [[package]] name = "llmx-utils-json-to-toml" -version = "0.1.7" +version = "0.1.8" dependencies = [ "pretty_assertions", "serde_json", @@ -3526,7 +3526,7 @@ dependencies = [ [[package]] name = "llmx-utils-pty" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "portable-pty", @@ -3535,7 +3535,7 @@ dependencies = [ [[package]] name = "llmx-utils-readiness" -version = "0.1.7" +version = "0.1.8" dependencies = [ "assert_matches", "async-trait", @@ -3546,11 +3546,11 @@ dependencies = [ [[package]] name = "llmx-utils-string" -version = "0.1.7" +version = "0.1.8" [[package]] name = "llmx-utils-tokenizer" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "pretty_assertions", @@ -3660,7 +3660,7 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "mcp-types" -version = "0.1.7" +version = "0.1.8" dependencies = [ "schemars 0.8.22", "serde", @@ -3670,7 +3670,7 @@ dependencies = [ [[package]] name = "mcp_test_support" -version = "0.1.7" +version = "0.1.8" dependencies = [ "anyhow", "assert_cmd", diff --git a/llmx-rs/Cargo.toml b/llmx-rs/Cargo.toml index 0d154bca..c66830bb 100644 --- a/llmx-rs/Cargo.toml +++ b/llmx-rs/Cargo.toml @@ -43,7 +43,7 @@ members = [ resolver = "2" [workspace.package] -version = "0.1.7" +version = "0.1.8" # Track the edition for all workspace crates in one place. Individual # crates can still override this value, but keeping it here means new # crates created with `cargo new -w ...` automatically inherit the 2024 diff --git a/llmx-rs/apply-patch/src/parser.rs b/llmx-rs/apply-patch/src/parser.rs index 768c89ad..d83bfe82 100644 --- a/llmx-rs/apply-patch/src/parser.rs +++ b/llmx-rs/apply-patch/src/parser.rs @@ -31,6 +31,7 @@ use thiserror::Error; const BEGIN_PATCH_MARKER: &str = "*** Begin Patch"; const END_PATCH_MARKER: &str = "*** End Patch"; const ADD_FILE_MARKER: &str = "*** Add File: "; +const CREATE_FILE_MARKER: &str = "*** Create File: "; // Alias for Add File const DELETE_FILE_MARKER: &str = "*** Delete File: "; const UPDATE_FILE_MARKER: &str = "*** Update File: "; const MOVE_TO_MARKER: &str = "*** Move to: "; @@ -245,8 +246,8 @@ fn check_start_and_end_lines_strict( fn parse_one_hunk(lines: &[&str], line_number: usize) -> Result<(Hunk, usize), ParseError> { // Be tolerant of case mismatches and extra padding around marker strings. let first_line = lines[0].trim(); - if let Some(path) = first_line.strip_prefix(ADD_FILE_MARKER) { - // Add File + if let Some(path) = first_line.strip_prefix(ADD_FILE_MARKER).or_else(|| first_line.strip_prefix(CREATE_FILE_MARKER)) { + // Add File (also accepts Create File as alias) let mut contents = String::new(); let mut parsed_lines = 1; for add_line in &lines[1..] { @@ -331,7 +332,7 @@ fn parse_one_hunk(lines: &[&str], line_number: usize) -> Result<(Hunk, usize), P Err(InvalidHunkError { message: format!( - "'{first_line}' is not a valid hunk header. Valid hunk headers: '*** Add File: {{path}}', '*** Delete File: {{path}}', '*** Update File: {{path}}'" + "'{first_line}' is not a valid hunk header. Valid hunk headers: '*** Add File: {{path}}', '*** Create File: {{path}}', '*** Delete File: {{path}}', '*** Update File: {{path}}'" ), line_number, }) diff --git a/llmx-rs/core/src/chat_completions.rs b/llmx-rs/core/src/chat_completions.rs index 08a54140..3883d2a5 100644 --- a/llmx-rs/core/src/chat_completions.rs +++ b/llmx-rs/core/src/chat_completions.rs @@ -443,8 +443,8 @@ pub(crate) async fn stream_chat_completions( }); // Add max_tokens - required by Anthropic Messages API - // Use provider config value or default to 8192 - let max_tokens = provider.max_tokens.unwrap_or(8192); + // Use provider config value or default to 20480 (5 * 4096, Claude Sonnet 4.5 supports up to 64K) + let max_tokens = provider.max_tokens.unwrap_or(20480); if let Some(obj) = payload.as_object_mut() { obj.insert("max_tokens".to_string(), json!(max_tokens)); } @@ -610,7 +610,9 @@ async fn process_chat_sse( ) where S: Stream> + Unpin, { + debug!("process_chat_sse started, idle_timeout={:?}", idle_timeout); let mut stream = stream.eventsource(); + debug!("SSE stream initialized, waiting for first event"); // State to accumulate a function call across streaming chunks. // OpenAI may split the `arguments` string over multiple `delta` events