From 0161e8eeddade6227066710808216cb226c61209 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:12:05 +0200 Subject: [PATCH 01/10] Remove the loripsum.go file as the loripsum.net website is down. --- handlers/loripsum.go | 116 ------------------------------------------- main.go | 1 - 2 files changed, 117 deletions(-) delete mode 100644 handlers/loripsum.go diff --git a/handlers/loripsum.go b/handlers/loripsum.go deleted file mode 100644 index f4ba7ce..0000000 --- a/handlers/loripsum.go +++ /dev/null @@ -1,116 +0,0 @@ -package handlers - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "net/url" - "path" -) - -func Loripsum(w http.ResponseWriter, r *http.Request) { - fmt.Println("Loripsum Called") - - params := &struct { - NumberOfParagraphs int `json:"number_of_paragraphs"` - ParagraphLength string `json:"paragraph_length"` - Decorate bool `json:"decorate"` - Link bool `json:"link"` - UnorderedLists bool `json:"unordered_lists"` - NumberedLists bool `json:"numbered_lists"` - DescriptionLists bool `json:"description_lists"` - BlockQuotes bool `json:"blockquotes"` - Code bool `json:"code"` - Headers bool `json:"headers"` - AllCaps bool `json:"all_caps"` - Prude bool `json:"prude"` - }{} - - err := json.NewDecoder(r.Body).Decode(¶ms) - if err != nil { - w.WriteHeader(http.StatusBadRequest) - return - } - - p := "api" - if params.NumberOfParagraphs != 0 { - if params.NumberOfParagraphs < 0 { - p = path.Join(p, "1") - } else if params.NumberOfParagraphs > 10 { - p = path.Join(p, "10") - } else { - p = path.Join(p, fmt.Sprintf("%v", params.NumberOfParagraphs)) - } - } - - if params.ParagraphLength == "short" || params.ParagraphLength == "medium" || params.ParagraphLength == "long" || params.ParagraphLength == "verylong" { - p = path.Join(p, params.ParagraphLength) - } - - if params.Decorate { - p = path.Join(p, "decorate") - } - - if params.Link { - p = path.Join(p, "link") - } - - if params.UnorderedLists { - p = path.Join(p, "ul") - } - - if params.NumberedLists { - p = path.Join(p, "ol") - } - - if params.DescriptionLists { - p = path.Join(p, "dl") - } - - if params.BlockQuotes { - p = path.Join(p, "bq") - } - - if params.Code { - p = path.Join(p, "code") - } - - if params.Headers { - p = path.Join(p, "headers") - } - - if params.AllCaps { - p = path.Join(p, "allcaps") - } - - if params.Prude { - p = path.Join(p, "prude") - } - - u, _ := url.Parse("https://loripsum.net") - u.Path = p - - req, err := http.NewRequestWithContext(r.Context(), http.MethodGet, u.String(), nil) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - return - } - - resp, err := (&http.Client{}).Do(req) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - return - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - w.WriteHeader(http.StatusInternalServerError) - return - } - - if _, err := io.Copy(w, resp.Body); err != nil { - fmt.Println("Something unrecoverable went wrong") - return - } -} diff --git a/main.go b/main.go index 80c60f8..eccb98d 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,6 @@ func main() { func run() error { http.HandleFunc("/random-commit-message", handlers.CommitMessage) - http.HandleFunc("/random-lorem-ipsum", handlers.Loripsum) http.HandleFunc("/random-user", handlers.User) http.HandleFunc("/_ping", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("OK")) From 36df77e06f4810c32f9fbd2df6239bf1c627c2a7 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:32:37 +0200 Subject: [PATCH 02/10] Add URL shortening handler using CleanURI API --- handlers/shorten_url.go | 74 +++++++++++++++++++++++++++++++++++++++++ main.go | 1 + 2 files changed, 75 insertions(+) create mode 100644 handlers/shorten_url.go diff --git a/handlers/shorten_url.go b/handlers/shorten_url.go new file mode 100644 index 0000000..5b26dc0 --- /dev/null +++ b/handlers/shorten_url.go @@ -0,0 +1,74 @@ +package handlers + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" +) + +// Estructura para recibir la petición JSON con la URL a acortar +type ShortenRequest struct { + URL string `json:"url"` +} + +// Handler HTTP para acortar URLs usando la API de CleanURI +func ShortenURL(w http.ResponseWriter, r *http.Request) { + fmt.Println("ShortenURL Called") // Log para saber que se llamó al handler + + // Decodifica el cuerpo de la petición esperando un JSON con el campo "url" + var reqData ShortenRequest + if err := json.NewDecoder(r.Body).Decode(&reqData); err != nil { + http.Error(w, "Invalid JSON", http.StatusBadRequest) + return + } + fmt.Printf("URL to shorten: %s\n", reqData.URL) // Log de la URL recibida + + // Prepara el cuerpo del formulario para la petición a CleanURI + form := []byte("url=" + reqData.URL) + // Crea la petición HTTP POST a la API de CleanURI + req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "https://cleanuri.com/api/v1/shorten", bytes.NewBuffer(form)) + if err != nil { + http.Error(w, "Failed to create request", http.StatusInternalServerError) + return + } + // Establece el header para indicar que el cuerpo es un formulario + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + // Realiza la petición a CleanURI + resp, err := http.DefaultClient.Do(req) + if err != nil { + http.Error(w, "Failed to contact CleanURI", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // Si CleanURI responde con un código diferente a 200 OK, devuelve el error + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + http.Error(w, fmt.Sprintf("CleanURI error: %s", string(body)), http.StatusInternalServerError) + return + } + + // Si todo sale bien, copia la respuesta de CleanURI al cliente + w.Header().Set("Content-Type", "application/json") + io.Copy(w, resp.Body) +} + +// Name: shorten_url +// Inference description: Shortens a long URL using the CleanURI service. Send a JSON body with the "url" field and receive the shortened URL in the response. +// URL: https://related-striking-swift.ngrok-free.app/shorten-url +// Parameters: +// { +// "type": "object", +// "properties": { +// "url": { +// "type": "string", +// "description": "The long URL to be shortened." +// } +// }, +// "required": ["url"] +// } +// } +// Return type: String \ No newline at end of file diff --git a/main.go b/main.go index eccb98d..b814d65 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,7 @@ func main() { func run() error { http.HandleFunc("/random-commit-message", handlers.CommitMessage) http.HandleFunc("/random-user", handlers.User) + http.HandleFunc("/shorten-url", handlers.ShortenURL) http.HandleFunc("/_ping", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("OK")) }) From 6f59c7fec59f52fa5ff7a8b6d16cb154b401a5cb Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:32:50 +0200 Subject: [PATCH 03/10] Add documentation for random commit message and random user handlers --- handlers/commit_message.go | 6 ++++++ handlers/user.go | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/handlers/commit_message.go b/handlers/commit_message.go index ee6cdf3..b7ee93c 100644 --- a/handlers/commit_message.go +++ b/handlers/commit_message.go @@ -31,3 +31,9 @@ func CommitMessage(w http.ResponseWriter, r *http.Request) { return } } + +// Name: random_commit_message +// Inference description: Generates a random commit message +// URL: https:///random-commit-message +// Parameters: { "type": "object" } +// Return type: String \ No newline at end of file diff --git a/handlers/user.go b/handlers/user.go index fe7d844..386f4fb 100644 --- a/handlers/user.go +++ b/handlers/user.go @@ -31,3 +31,9 @@ func User(w http.ResponseWriter, r *http.Request) { return } } + +// Name: random_user +// Inference description: Generates data for a random user +// URL: https:///random-user +// Parameters: { "type": "object" } +// Return type: String From a5edc995b1c21a61508fb6a6960be51e5d7860d5 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:33:54 +0200 Subject: [PATCH 04/10] Adding the API url for better explanation shorten_url.go --- handlers/shorten_url.go | 87 +++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/handlers/shorten_url.go b/handlers/shorten_url.go index 5b26dc0..b7b8612 100644 --- a/handlers/shorten_url.go +++ b/handlers/shorten_url.go @@ -1,65 +1,68 @@ package handlers import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" ) +// API de CleanURI para acortar URLs +// https://cleanuri.com/docs + // Estructura para recibir la petición JSON con la URL a acortar type ShortenRequest struct { - URL string `json:"url"` + URL string `json:"url"` } // Handler HTTP para acortar URLs usando la API de CleanURI func ShortenURL(w http.ResponseWriter, r *http.Request) { - fmt.Println("ShortenURL Called") // Log para saber que se llamó al handler + fmt.Println("ShortenURL Called") // Log para saber que se llamó al handler - // Decodifica el cuerpo de la petición esperando un JSON con el campo "url" - var reqData ShortenRequest - if err := json.NewDecoder(r.Body).Decode(&reqData); err != nil { - http.Error(w, "Invalid JSON", http.StatusBadRequest) - return - } - fmt.Printf("URL to shorten: %s\n", reqData.URL) // Log de la URL recibida + // Decodifica el cuerpo de la petición esperando un JSON con el campo "url" + var reqData ShortenRequest + if err := json.NewDecoder(r.Body).Decode(&reqData); err != nil { + http.Error(w, "Invalid JSON", http.StatusBadRequest) + return + } + fmt.Printf("URL to shorten: %s\n", reqData.URL) // Log de la URL recibida - // Prepara el cuerpo del formulario para la petición a CleanURI - form := []byte("url=" + reqData.URL) - // Crea la petición HTTP POST a la API de CleanURI - req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "https://cleanuri.com/api/v1/shorten", bytes.NewBuffer(form)) - if err != nil { - http.Error(w, "Failed to create request", http.StatusInternalServerError) - return - } - // Establece el header para indicar que el cuerpo es un formulario - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + // Prepara el cuerpo del formulario para la petición a CleanURI + form := []byte("url=" + reqData.URL) + // Crea la petición HTTP POST a la API de CleanURI + req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "https://cleanuri.com/api/v1/shorten", bytes.NewBuffer(form)) + if err != nil { + http.Error(w, "Failed to create request", http.StatusInternalServerError) + return + } + // Establece el header para indicar que el cuerpo es un formulario + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - // Realiza la petición a CleanURI - resp, err := http.DefaultClient.Do(req) - if err != nil { - http.Error(w, "Failed to contact CleanURI", http.StatusInternalServerError) - return - } - defer resp.Body.Close() + // Realiza la petición a CleanURI + resp, err := http.DefaultClient.Do(req) + if err != nil { + http.Error(w, "Failed to contact CleanURI", http.StatusInternalServerError) + return + } + defer resp.Body.Close() - // Si CleanURI responde con un código diferente a 200 OK, devuelve el error - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - http.Error(w, fmt.Sprintf("CleanURI error: %s", string(body)), http.StatusInternalServerError) - return - } + // Si CleanURI responde con un código diferente a 200 OK, devuelve el error + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + http.Error(w, fmt.Sprintf("CleanURI error: %s", string(body)), http.StatusInternalServerError) + return + } - // Si todo sale bien, copia la respuesta de CleanURI al cliente - w.Header().Set("Content-Type", "application/json") - io.Copy(w, resp.Body) + // Si todo sale bien, copia la respuesta de CleanURI al cliente + w.Header().Set("Content-Type", "application/json") + io.Copy(w, resp.Body) } // Name: shorten_url // Inference description: Shortens a long URL using the CleanURI service. Send a JSON body with the "url" field and receive the shortened URL in the response. // URL: https://related-striking-swift.ngrok-free.app/shorten-url -// Parameters: +// Parameters: // { // "type": "object", // "properties": { @@ -71,4 +74,4 @@ func ShortenURL(w http.ResponseWriter, r *http.Request) { // "required": ["url"] // } // } -// Return type: String \ No newline at end of file +// Return type: String From fde61bf6040c7c2a553f53f9b07ccc59edc39fd2 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:39:27 +0200 Subject: [PATCH 05/10] Update README and shorten_url handler to reflect URL shortening functionality --- README.md | 29 +++++++++++++---------------- handlers/shorten_url.go | 1 - 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index ab16992..15b9dfd 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Use agents instead if you need: This extension showcases the skillset approach by providing three simple endpoints that generate random development data: - Random commit messages -- Lorem ipsum text generation +- URL shortener - Random user data ## Getting Started @@ -72,22 +72,19 @@ URL: https:///random-commit-message Parameters: { "type": "object" } Return type: String --- -Name: random_lorem_ipsum -Inference description: Generates a random Lorem Ipsum text. Responses should have html tags present. -URL: https:///random-lorem-ipsum +Name: shorten_url +Inference description: Shortens a long URL using the CleanURI service. Send a JSON body with the "url" field and receive the shortened URL in the response. +URL: https://related-striking-swift.ngrok-free.app/shorten-url Parameters: { - "type": "object", - "properties": { - "number_of_paragraphs": { - "type": "number", - "description": "The number of paragraphs to be generated. Must be between 1 and 10 inclusive" - }, - "paragraph_length": { - "type": "string", - "description": "The length of each paragraph. Must be one of \"short\", \"medium\", \"long\", or \"verylong\"" - } - } + "type": "object", + "properties": { + "url": { + "type": "string", + "description": "The long URL to be shortened." + } + }, + "required": ["url"] } Return type: String --- @@ -120,7 +117,7 @@ Here's some example things: This bot provides a passthrough to a couple of other APIs: * For commit messages, https://whatthecommit.com/ -* For Lorem Ipsum, https://loripsum.net/ +* For shorting URLs, https://cleanuri.com/ * For user data, https://randomuser.me/ ## Documentation diff --git a/handlers/shorten_url.go b/handlers/shorten_url.go index b7b8612..3530227 100644 --- a/handlers/shorten_url.go +++ b/handlers/shorten_url.go @@ -73,5 +73,4 @@ func ShortenURL(w http.ResponseWriter, r *http.Request) { // }, // "required": ["url"] // } -// } // Return type: String From b4fddce31da7556a2a97b17c294b20da0d066938 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:56:34 +0200 Subject: [PATCH 06/10] Update README to include example for URL shortening command --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 15b9dfd..e766b2a 100644 --- a/README.md +++ b/README.md @@ -108,8 +108,7 @@ Return type: String Here's some example things: * `@skillset-example please create a random commit message` -* `@skillset-example generate a lorem ipsum` -* `@skillset-example generate a short lorem ipsum with 3 paragraphs` +* `@skillset-example please short this url https://github.com` * `@skillset-example generate random user data` ## Implementation From 9fcf6b282666783740cfc4e7e3ba1b17a4d4cd6a Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:56:43 +0200 Subject: [PATCH 07/10] Remove unused comments and documentation for random commit and user handlers --- handlers/commit_message.go | 8 +-- handlers/shorten_url.go | 114 ++++++++++++++++--------------------- handlers/user.go | 8 +-- 3 files changed, 51 insertions(+), 79 deletions(-) diff --git a/handlers/commit_message.go b/handlers/commit_message.go index b7ee93c..19e4e1e 100644 --- a/handlers/commit_message.go +++ b/handlers/commit_message.go @@ -30,10 +30,4 @@ func CommitMessage(w http.ResponseWriter, r *http.Request) { fmt.Println("Something unrecoverable went wrong") return } -} - -// Name: random_commit_message -// Inference description: Generates a random commit message -// URL: https:///random-commit-message -// Parameters: { "type": "object" } -// Return type: String \ No newline at end of file +} \ No newline at end of file diff --git a/handlers/shorten_url.go b/handlers/shorten_url.go index 3530227..8da57fb 100644 --- a/handlers/shorten_url.go +++ b/handlers/shorten_url.go @@ -1,76 +1,60 @@ package handlers import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" ) -// API de CleanURI para acortar URLs +// CleanURI API for shortening URLs // https://cleanuri.com/docs -// Estructura para recibir la petición JSON con la URL a acortar +// Structure to receive the JSON request with the URL to shorten type ShortenRequest struct { - URL string `json:"url"` + URL string `json:"url"` } -// Handler HTTP para acortar URLs usando la API de CleanURI +// HTTP handler to shorten URLs using the CleanURI API func ShortenURL(w http.ResponseWriter, r *http.Request) { - fmt.Println("ShortenURL Called") // Log para saber que se llamó al handler - - // Decodifica el cuerpo de la petición esperando un JSON con el campo "url" - var reqData ShortenRequest - if err := json.NewDecoder(r.Body).Decode(&reqData); err != nil { - http.Error(w, "Invalid JSON", http.StatusBadRequest) - return - } - fmt.Printf("URL to shorten: %s\n", reqData.URL) // Log de la URL recibida - - // Prepara el cuerpo del formulario para la petición a CleanURI - form := []byte("url=" + reqData.URL) - // Crea la petición HTTP POST a la API de CleanURI - req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "https://cleanuri.com/api/v1/shorten", bytes.NewBuffer(form)) - if err != nil { - http.Error(w, "Failed to create request", http.StatusInternalServerError) - return - } - // Establece el header para indicar que el cuerpo es un formulario - req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - - // Realiza la petición a CleanURI - resp, err := http.DefaultClient.Do(req) - if err != nil { - http.Error(w, "Failed to contact CleanURI", http.StatusInternalServerError) - return - } - defer resp.Body.Close() - - // Si CleanURI responde con un código diferente a 200 OK, devuelve el error - if resp.StatusCode != http.StatusOK { - body, _ := io.ReadAll(resp.Body) - http.Error(w, fmt.Sprintf("CleanURI error: %s", string(body)), http.StatusInternalServerError) - return - } - - // Si todo sale bien, copia la respuesta de CleanURI al cliente - w.Header().Set("Content-Type", "application/json") - io.Copy(w, resp.Body) -} - -// Name: shorten_url -// Inference description: Shortens a long URL using the CleanURI service. Send a JSON body with the "url" field and receive the shortened URL in the response. -// URL: https://related-striking-swift.ngrok-free.app/shorten-url -// Parameters: -// { -// "type": "object", -// "properties": { -// "url": { -// "type": "string", -// "description": "The long URL to be shortened." -// } -// }, -// "required": ["url"] -// } -// Return type: String + fmt.Println("ShortenURL Called") // Log to know the handler was called + + // Decode the request body expecting a JSON with the "url" field + var reqData ShortenRequest + if err := json.NewDecoder(r.Body).Decode(&reqData); err != nil { + http.Error(w, "Invalid JSON", http.StatusBadRequest) + return + } + fmt.Printf("URL to shorten: %s\n", reqData.URL) // Log the received URL + + // Prepare the form body for the request to CleanURI + form := []byte("url=" + reqData.URL) + // Create the HTTP POST request to the CleanURI API + req, err := http.NewRequestWithContext(r.Context(), http.MethodPost, "https://cleanuri.com/api/v1/shorten", bytes.NewBuffer(form)) + if err != nil { + http.Error(w, "Failed to create request", http.StatusInternalServerError) + return + } + // Set the header to indicate the body is a form + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + + // Make the request to CleanURI + resp, err := http.DefaultClient.Do(req) + if err != nil { + http.Error(w, "Failed to contact CleanURI", http.StatusInternalServerError) + return + } + defer resp.Body.Close() + + // If CleanURI responds with a code other than 200 OK, return the error + if resp.StatusCode != http.StatusOK { + body, _ := io.ReadAll(resp.Body) + http.Error(w, fmt.Sprintf("CleanURI error: %s", string(body)), http.StatusInternalServerError) + return + } + + // If everything goes well, copy CleanURI's response to the client + w.Header().Set("Content-Type", "application/json") + io.Copy(w, resp.Body) +} \ No newline at end of file diff --git a/handlers/user.go b/handlers/user.go index 386f4fb..ccb6a9f 100644 --- a/handlers/user.go +++ b/handlers/user.go @@ -30,10 +30,4 @@ func User(w http.ResponseWriter, r *http.Request) { fmt.Println("Something unrecoverable went wrong") return } -} - -// Name: random_user -// Inference description: Generates data for a random user -// URL: https:///random-user -// Parameters: { "type": "object" } -// Return type: String +} \ No newline at end of file From 17ddff9ea6cfe89be53121e0505cd558f8365eb1 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:58:31 +0200 Subject: [PATCH 08/10] Fix missing newline at end of file in user.go --- handlers/user.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/user.go b/handlers/user.go index ccb6a9f..fe7d844 100644 --- a/handlers/user.go +++ b/handlers/user.go @@ -30,4 +30,4 @@ func User(w http.ResponseWriter, r *http.Request) { fmt.Println("Something unrecoverable went wrong") return } -} \ No newline at end of file +} From 1dace6bf7d7bbaa97845da812b77a37662054397 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 18:59:03 +0200 Subject: [PATCH 09/10] Fix missing newline at end of file in commit_message.go --- handlers/commit_message.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/commit_message.go b/handlers/commit_message.go index 19e4e1e..ee6cdf3 100644 --- a/handlers/commit_message.go +++ b/handlers/commit_message.go @@ -30,4 +30,4 @@ func CommitMessage(w http.ResponseWriter, r *http.Request) { fmt.Println("Something unrecoverable went wrong") return } -} \ No newline at end of file +} From e43bea6b2784c44afc48965c541c4b13b7f62dd2 Mon Sep 17 00:00:00 2001 From: Alex Cerezo Date: Tue, 1 Jul 2025 19:14:29 +0200 Subject: [PATCH 10/10] Update README to use placeholder for ngrok domain in shorten_url endpoint --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e766b2a..c7d2e95 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ Return type: String --- Name: shorten_url Inference description: Shortens a long URL using the CleanURI service. Send a JSON body with the "url" field and receive the shortened URL in the response. -URL: https://related-striking-swift.ngrok-free.app/shorten-url +URL: https:///shorten-url Parameters: { "type": "object",