diff --git a/README.md b/README.md index e74cdf6..4d4c41a 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,13 @@ The different SSE events in the [agent protocol](TODO) that the CLI gives debug ``` 1. See more info about the cli tool ```shell - gh debug-cli -h + gh debug-cli chat -h ``` -## Using the debug tool -1. Run the following command `gh debug-cli -h` to see the different flags that it takes in. +## Using the debug chat tool +1. Run the following command `gh debug-cli chat -h` to see the different flags that it takes in. ``` -> gh debug-cli -h +> gh debug-cli chat -h This cli tool allows you to debug your agent by chatting with it locally. Usage: @@ -47,7 +47,7 @@ export URL="http://localhost:8080/agent/blackbeard" ``` 3. When you run the CLI, you will see any flags that were previously set in your environment variables as the output. ``` -> gh debug-cli +> gh debug-cli chat Setting url to http://localhost:8080/agents/blackbeard Start typing to chat with your assistant... @@ -55,7 +55,7 @@ sparklyunicorn: ``` 4. Type something to simulate chatting with your assistant. ``` -> gh debug-cli +> gh debug-cli chat Setting url to http://localhost:8080/agents/blackbeard Start typing to chat with your assistant... @@ -114,7 +114,7 @@ assistant: Avast, @monalisa! Me apologies if I didn't quite understand yer reque ``` 7. And if debug mode was set to false, then I would only see the confirmation prompt itself. ``` -gh debug-cli --log-level none +gh debug-cli chat --log-level none Setting url to http://localhost:8080/agents/blackbeard Start typing to chat with your assistant... @@ -126,3 +126,27 @@ Be ye sure ye want a custom limerick 'bout petals ? Reply: [y/N] ``` 8. Currently, the supported event types for debug mode are references, errors, and confirmations! Have fun chatting with your assistant! + +## Using the gh debug stream tool +1. To quickly parse an agent response by running command `gh debug-cli stream --file test.txt` + +2. This tool will take llm streaming response and parse it to make it more readable + + - In this example, if a file test.txt holds the following streamed response. Then will return the response "A closure in JavaScript is a function that retains access... " This will make repsonse more readable. + +example of .txt file + +``` +data: {"choices":[{"delta":{"content":"A closure in JavaScript "}}],"created":1727120830,"id":"chatcmpl-AAjJW0Nz9E2Gu1P6YQMFqqmn10mdR","model":"gpt-4o-2024-05-13","system_fingerprint":"fp_80a1bad4c7"} +data: {"choices":[{"delta":{"content":"is a function that retains access "}}],"created":1727120831,"id":"chatcmpl-AAjJW0Nz9E2Gu1P6YQMFqqmn10mdR","model":"gpt-4o-2024-05-13","system_fingerprint":"fp_80a1bad4c7"} +data: {"choices":[{"delta":{"content":"to its lexical scope, even "}}],"created":1727120832,"id":"chatcmpl-AAjJW0Nz9E2Gu1P6YQMFqqmn10mdR","model":"gpt-4o-2024-05-13","system_fingerprint":"fp_80a1bad4c7"} +data: {"choices":[{"delta":{"content":"when the function is executed "}}],"created":1727120833,"id":"chatcmpl-AAjJW0Nz9E2Gu1P6YQMFqqmn10mdR","model":"gpt-4o-2024-05-13","system_fingerprint":"fp_80a1bad4c7"} +data: {"choices":[{"delta":{"content":"outside that scope. "}}],"created":1727120834,"id":"chatcmpl-AAjJW0Nz9E2Gu1P6YQMFqqmn10mdR","model":"gpt-4o-2024-05-13","system_fingerprint":"fp_80a1bad4c7"} +``` + +## Copilot Extensions Documentation +- [Using Copilot Extensions](https://docs.github.com/en/copilot/using-github-copilot/using-extensions-to-integrate-external-tools-with-copilot-chat) +- [About building Copilot Extensions](https://docs.github.com/en/copilot/building-copilot-extensions/about-building-copilot-extensions) +- [Set up process](https://docs.github.com/en/copilot/building-copilot-extensions/setting-up-copilot-extensions) +- [Communicating with the Copilot platform](https://docs.github.com/en/copilot/building-copilot-extensions/building-a-copilot-agent-for-your-copilot-extension/configuring-your-copilot-agent-to-communicate-with-the-copilot-platform) +- [Communicating with GitHub](https://docs.github.com/en/copilot/building-copilot-extensions/building-a-copilot-agent-for-your-copilot-extension/configuring-your-copilot-agent-to-communicate-with-github) diff --git a/cmd/rootCmd.go b/cmd/rootCmd.go index 64b6c1a..f7cb407 100644 --- a/cmd/rootCmd.go +++ b/cmd/rootCmd.go @@ -9,11 +9,9 @@ import ( ) var rootCmd = &cobra.Command{ - Use: "gh-debug-cli", Short: "A CLI tool for debugging", Long: `This CLI tool allows you to debug your agent by chatting with it locally.`, Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Use 'gh-debug-cli --help' to see available commands") }, } diff --git a/cmd/stream.go b/cmd/stream.go index 24bf21b..1d90fda 100644 --- a/cmd/stream.go +++ b/cmd/stream.go @@ -15,9 +15,9 @@ const ( // streamCmd represents the new command for streaming functionality var streamCmd = &cobra.Command{ - Use: "stream [file]", - Short: "Stream data to your agent", - Long: `The stream command allows you to initiate a data stream to your agent.`, + Use: "stream --file [filename]", + Short: "Parse stream data from agent", + Long: `Allows you to parse a data stream to your agent response.`, Run: agentStream, } @@ -28,11 +28,16 @@ func init() { func agentStream(cmd *cobra.Command, args []string) { fmt.Println("stream command executed successfully") - file := args[0] + file, _ := cmd.Flags().GetString(streamCmdFileFlag) + if file == "" { + fmt.Fprintln(os.Stderr, "Error: --file [file] is required") + os.Exit(1) + } - err := stream.ParseFile(file) + result, err := stream.ParseFile(file) if err != nil { fmt.Fprintf(os.Stderr, "Error parsing file: %v\n", err) os.Exit(1) } + fmt.Println(result) } diff --git a/pkg/stream/parse.go b/pkg/stream/parse.go index e1929ae..01ba78f 100644 --- a/pkg/stream/parse.go +++ b/pkg/stream/parse.go @@ -18,11 +18,11 @@ type Data struct { Choices []Choice `json:"choices"` } -func ParseFile(filename string) error { +func ParseFile(filename string) (string, error) { // Open the file file, err := os.Open(filename) if err != nil { - return fmt.Errorf("could not open file: %w", err) + return "", fmt.Errorf("could not open file: %w", err) } defer file.Close() @@ -52,8 +52,7 @@ func ParseFile(filename string) error { var data Data err := json.Unmarshal([]byte(line), &data) if err != nil { - // Skip this line if JSON is incomplete or malformed - continue + return "", fmt.Errorf("error parsing JSON: %w", err) } // Extract delta.content and concatenate it @@ -64,12 +63,10 @@ func ParseFile(filename string) error { // Check for scanner errors if err := scanner.Err(); err != nil { - return fmt.Errorf("error reading file: %w", err) + return "", fmt.Errorf("error reading file: %w", err) } // Print the final concatenated result result := contentBuilder.String() - fmt.Println(result) - - return nil + return result, nil }