Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release voice agent API #274

Merged
merged 6 commits into from
Feb 3, 2025
Merged

Release voice agent API #274

merged 6 commits into from
Feb 3, 2025

Conversation

jpvajda
Copy link
Contributor

@jpvajda jpvajda commented Jan 31, 2025

Proposed changes

  • Adds Agent API
  • Updates Readme
  • Fixes a few tests

Summary by CodeRabbit

Based on the comprehensive changes, here are the updated release notes:

  • New Features

    • Added Agent API (Real-Time) WebSocket support for advanced conversational interactions.
    • Introduced new configuration options for audio input, agent settings, and context management.
    • Implemented real-time message handling for various agent responses.
    • Added a new section in the README for Agent API (Real-Time) example with microphone usage.
  • Documentation

    • Updated README with detailed configuration instructions for Agent API example.
    • Added comprehensive documentation for WebSocket connection and message processing.
  • Improvements

    • Enhanced error handling and logging for WebSocket connections.
    • Implemented flexible channel-based message routing.
    • Added support for microphone-based audio streaming.
  • Breaking Changes

    • Deprecated previous Live and PreRecorded API client functions.
    • Introduced new Agent-specific client initialization methods.

Copy link

coderabbitai bot commented Jan 31, 2025

Walkthrough

The pull request introduces a comprehensive implementation of the Agent API for the Deepgram SDK, focusing on real-time WebSocket communication. The changes span multiple packages, adding support for agent-based interactions, including WebSocket message handling, configuration options, and a sample application demonstrating microphone-based conversation insights. The implementation provides a robust framework for managing agent-related communications, with detailed error handling, message routing, and configuration capabilities.

Changes

File Change Summary
examples/agent/websocket/simple/README.md Added documentation for Agent API (Real-Time) example, including microphone setup and Deepgram API key configuration.
examples/agent/websocket/simple/main.go Implemented main application for real-time audio processing using Deepgram SDK.
pkg/api/agent/v1/websocket/* Added new package for WebSocket message handling, routing, and interfaces.
pkg/client/agent/* Introduced client implementation for Agent API, including connection management and message handling.
pkg/client/interfaces/v1/types-agent.go Defined comprehensive configuration structures for Agent API settings.
pkg/api/version/* Updated versioning and path handling to support Agent API.
pkg/common/constants.go Added default host for Agent API.
README.md Updated to include a new section for Agent examples and improved testing instructions.
tests/* Modified tests to align with new WebSocket client methods and updated expected response formats.

Sequence Diagram

sequenceDiagram
    participant User
    participant AgentClient
    participant DeepgramWebSocket
    participant AudioInput
    participant MessageRouter

    User->>AgentClient: Initialize with settings
    AgentClient->>DeepgramWebSocket: Establish WebSocket connection
    AudioInput->>AgentClient: Stream audio data
    AgentClient->>DeepgramWebSocket: Send audio chunks
    DeepgramWebSocket->>MessageRouter: Route incoming messages
    MessageRouter-->>AgentClient: Process responses
    MessageRouter->>User: Provide conversation insights
Loading

This diagram illustrates the high-level flow of the Agent API, showing how audio is streamed, processed, and routed through the WebSocket connection, with messages being handled by a dedicated router.


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d6f1755 and cc14d32.

📒 Files selected for processing (7)
  • examples/agent/websocket/simple/main.go (1 hunks)
  • pkg/api/agent/v1/websocket/chan_default.go (1 hunks)
  • pkg/api/agent/v1/websocket/chan_router.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/constants.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/interfaces.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/types.go (1 hunks)
  • pkg/api/agent/v1/websocket/types.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • pkg/api/agent/v1/websocket/types.go
  • pkg/api/agent/v1/websocket/interfaces/constants.go
🧰 Additional context used
📓 Learnings (1)
pkg/api/agent/v1/websocket/chan_default.go (3)
Learnt from: jpvajda
PR: deepgram/deepgram-go-sdk#274
File: pkg/api/agent/v1/websocket/chan_default.go:20-59
Timestamp: 2025-01-31T17:28:31.839Z
Learning: The `endOfThoughtResponse` field exists in DefaultChanHandler but its type `EndOfThoughtResponse` is not defined in the interfaces package, causing compilation errors.
Learnt from: jpvajda
PR: deepgram/deepgram-go-sdk#274
File: pkg/api/agent/v1/websocket/chan_default.go:20-59
Timestamp: 2025-01-31T17:28:31.839Z
Learning: The DefaultChanHandler struct in the Agent API does not include an endOfThoughtResponse field, and any initialization of this field in NewDefaultChanHandler is incorrect.
Learnt from: jpvajda
PR: deepgram/deepgram-go-sdk#274
File: pkg/api/agent/v1/websocket/chan_default.go:20-59
Timestamp: 2025-01-31T17:28:31.839Z
Learning: The `EndOfThoughtResponse` type and `endOfThoughtResponse` field are not part of the Agent API implementation in the Deepgram Go SDK.
🪛 GitHub Check: Lint
pkg/api/agent/v1/websocket/chan_default.go

[failure] 63-63:
hugeParam: dch is heavy (136 bytes); consider passing it by pointer (gocritic)


[failure] 68-68:
hugeParam: dch is heavy (136 bytes); consider passing it by pointer (gocritic)


[failure] 73-73:
hugeParam: dch is heavy (136 bytes); consider passing it by pointer (gocritic)

🔇 Additional comments (8)
pkg/api/agent/v1/websocket/interfaces/interfaces.go (1)

11-29: LGTM!

The AgentMessageChan interface is well-designed with consistent method signatures and clear naming conventions. Each method returns a slice of channel pointers, allowing for multiple subscribers to receive platform messages.

pkg/api/agent/v1/websocket/interfaces/types.go (2)

108-108: Address TODO comment for undefined input type.

The input field in FunctionCallRequestResponse is marked as undefined. Consider defining a more specific type than map[string]string to better represent the function call input parameters.

Do you want me to help define a more specific type for the function call input parameters?


114-114: Address TODO comment for undefined output type.

The output field in FunctionCallingResponse is marked as undefined. Consider defining a more specific type than map[string]string to better represent the function call output.

Do you want me to help define a more specific type for the function call output?

examples/agent/websocket/simple/main.go (2)

394-394: Verify the model name.

The model name "gpt-4o-mini" appears to be incorrect. Verify the correct model name from the available options.


61-63: Consider error handling for goroutine.

The goroutine running handler.Run() should have error handling to prevent silent failures.

pkg/api/agent/v1/websocket/chan_router.go (1)

155-170: LGTM!

The processGeneric function provides a consistent pattern for handling all message types, with proper logging and error handling.

pkg/api/agent/v1/websocket/chan_default.go (2)

488-489: Fix incorrect error message in error channel handler.

The error message in the error channel handler incorrectly refers to "Close" instead of "Error".


63-140: Use pointer receiver for methods with large structs.

The static analysis tool indicates that DefaultChanHandler is a large struct (136 bytes). Using value receivers creates unnecessary copies.

🧰 Tools
🪛 GitHub Check: Lint

[failure] 63-63:
hugeParam: dch is heavy (136 bytes); consider passing it by pointer (gocritic)


[failure] 68-68:
hugeParam: dch is heavy (136 bytes); consider passing it by pointer (gocritic)


[failure] 73-73:
hugeParam: dch is heavy (136 bytes); consider passing it by pointer (gocritic)

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (24)
pkg/client/agent/v1/websocket/client_channel.go (2)

52-63: Ensure host field usage aligns with connection logic.
The GetURL method currently takes a host parameter but references c.cOptions.Host internally. Confirm that this logic is intentional (perhaps ignoring the passed-in host), or adjust as needed to avoid confusion in future refactors.


64-84: Add error handling or fallback for keepalive activation.
When c.cOptions.EnableKeepAlive is set to true, a goroutine is spawned to repeatedly send keepalive messages. If this goroutine fails or panics, it only logs an error. Consider adding a fallback or escalation mechanism, especially if keepalive is critical to the session.

pkg/api/agent/v1/websocket/chan_router.go (2)

19-30: Verify error handling for default channel handler creation.
NewChanWithDefault starts chans.Run() in a separate goroutine, but any returned error is only logged. If the run loop is critical, consider providing a mechanism to retry or escalate the error if needed.


380-392: Return more descriptive errors for unhandled message types.
The UnhandledMessage method logs an unknown event and returns ErrInvalidMessageType. You may consider embedding context (e.g., partial message content) in the error for better debugging.

pkg/api/agent/v1/websocket/chan_default.go (1)

414-440: Double-check logs and user-facing output for error information.
The error channel prints details about the error, which is valuable for users. Ensure these logs do not inadvertently leak sensitive data or become noisy in production.

pkg/client/agent/v1/websocket/constants.go (2)

11-21: LGTM! Consider adding documentation for external constants.

The constants have reasonable default values. Consider adding documentation comments for the external constants to explain their purpose and any constraints.

Add documentation comments for DefaultConnectRetry, ChunkSize, and TerminationSleep similar to how MessageTypeKeepAlive is documented.


28-32: Consider making internal constants private.

Internal constants should follow Go's naming convention of using lowercase for package-private entities.

 // internal constants for retry, waits, back-off, etc.
 const (
-	flushPeriod = 500 * time.Millisecond
-	pingPeriod  = 5 * time.Second
+	_flushPeriod = 500 * time.Millisecond
+	_pingPeriod  = 5 * time.Second
 )
pkg/api/agent/v1/websocket/interfaces/interfaces.go (1)

11-11: Fix typo in documentation.

There's a typo in the comment: "notifcations" should be "notifications".

-// AgentMessageChan is a callback used to receive notifcations for platforms messages
+// AgentMessageChan is a callback used to receive notifications for platform messages
pkg/client/agent/v1/websocket/types.go (1)

25-35: Enhance struct documentation.

While the struct design is good, consider adding documentation for each field to improve code maintainability.

 // WSChannel is a struct representing the websocket client connection using channels
 type WSChannel struct {
+    // WSClient is the embedded base WebSocket client
     *common.WSClient
+    // ctx is the context for managing the WebSocket connection lifecycle
     ctx       context.Context
+    // ctxCancel is the function to cancel the context
     ctxCancel context.CancelFunc

+    // cOptions contains client configuration options
     cOptions *interfaces.ClientOptions
+    // tOptions contains settings configuration options
     tOptions *interfaces.SettingsConfigurationOptions

+    // chans is a slice of message channels for handling agent messages
     chans  []*msginterface.AgentMessageChan
+    // router handles message routing
     router *commoninterfaces.Router
 }
pkg/client/agent/init.go (1)

11-11: Add a link to the referenced documentation.

The comment references pkg/common/init.go but doesn't provide a direct link. Consider adding a package documentation link for better developer experience.

pkg/api/agent/v1/websocket/interfaces/constants.go (2)

11-12: Add detailed documentation for TypeResponse.

The TypeResponse type alias would benefit from more detailed documentation explaining its purpose and usage in the context of WebSocket message handling.


15-23: Fix alignment of constant declarations.

The constant declarations have inconsistent alignment. Consider aligning them for better readability:

 const (
-	TypeSettingsConfiguration = "SettingsConfiguration"
-	TypeUpdateInstructions    = "UpdateInstructions"
-	TypeUpdateSpeak           = "UpdateSpeak"
-	TypeInjectAgentMessage    = "InjectAgentMessage"
-	TypeFunctionCallResponse  = "FunctionCallResponse"
-	TypeKeepAlive             = "KeepAlive"
-	TypeClose                 = "Close"
+	TypeSettingsConfiguration = "SettingsConfiguration"
+	TypeUpdateInstructions   = "UpdateInstructions"
+	TypeUpdateSpeak         = "UpdateSpeak"
+	TypeInjectAgentMessage  = "InjectAgentMessage"
+	TypeFunctionCallResponse = "FunctionCallResponse"
+	TypeKeepAlive          = "KeepAlive"
+	TypeClose              = "Close"
 )
pkg/api/agent/v1/websocket/types.go (2)

14-16: Fix incorrect struct name in comment.

The comment refers to "DefaultCallbackHandler" but the struct is named "DefaultChanHandler". Update the comment to match the actual struct name.

-// DefaultCallbackHandler is a default callback handler for live transcription
+// DefaultChanHandler is a default channel handler for live transcription
 // Simply prints the transcript to stdout

17-33: Add documentation for debug fields and standardize channel naming.

  • Add documentation explaining the purpose of debugWebsocket and debugWebsocketVerbose fields
  • Consider standardizing channel naming (some use "Chan" suffix, others use "Response" suffix)
 type DefaultChanHandler struct {
+	// debugWebsocket enables basic websocket debugging
 	debugWebsocket        bool
+	// debugWebsocketVerbose enables detailed websocket debugging
 	debugWebsocketVerbose bool

 	binaryChan                   chan *[]byte
 	openChan                     chan *interfaces.OpenResponse
-	welcomeResponse              chan *interfaces.WelcomeResponse
+	welcomeChan                  chan *interfaces.WelcomeResponse
-	conversationTextResponse     chan *interfaces.ConversationTextResponse
+	conversationTextChan         chan *interfaces.ConversationTextResponse
 	// ... similar changes for other channels
pkg/client/interfaces/v1/types-agent.go (1)

13-84: Consider adding field validation and enhancing documentation.

The structs would benefit from:

  1. Field validation using struct tags (e.g., for required fields, value ranges)
  2. More detailed documentation for complex fields
  3. Examples of valid configurations

Example improvements:

 type SettingsConfigurationOptions struct {
-	Type    string   `json:"type"`
+	Type    string   `json:"type" validate:"required,oneof=agent"`
 	Audio   Audio    `json:"audio"`
 	Agent   Agent    `json:"agent"`
 	Context *Context `json:"context,omitempty"`
 }

+// Audio configures both input and output audio settings
 type Audio struct {
-	Input  *Input  `json:"input,omitempty"`
+	Input  *Input  `json:"input,omitempty" validate:"required"`
 	Output *Output `json:"output,omitempty"`
 }

+// Input defines the audio input configuration
+// Example:
+//   Input{
+//     Encoding: "wav",
+//     SampleRate: 16000,
+//   }
 type Input struct {
-	Encoding   string `json:"encoding,omitempty"`
+	Encoding   string `json:"encoding,omitempty" validate:"required,oneof=wav mp3"`
-	SampleRate int    `json:"sample_rate,omitempty"`
+	SampleRate int    `json:"sample_rate,omitempty" validate:"required,oneof=8000 16000 44100"`
 }
pkg/api/version/version.go (2)

37-40: Consider enhancing the log message for better debugging.

While the host override logic is correct, the log message could be more descriptive.

-		klog.V(4).Infof("overriding with agent host\n")
+		klog.V(4).Infof("overriding default host %s with agent host %s\n", common.DefaultHost, common.DefaultAgentHost)

69-72: Consider enhancing the log message for better debugging.

While the version override logic is correct, the log message could be more descriptive.

-		klog.V(4).Infof("overriding agent version with empty string since API isn't versioned\n")
+		klog.V(4).Infof("overriding agent version from %s to empty string since API isn't versioned\n", version)
pkg/client/agent/client.go (1)

5-8: Enhance package documentation.

Consider adding more details to the package documentation, such as usage examples and common patterns.

 /*
-This package provides the agent client implementation for the Deepgram API
+Package agent provides the client implementation for the Deepgram Agent API.
+
+It offers various ways to establish WebSocket connections with different configuration options:
+- NewWSUsingChanForDemo: Quick setup for demonstration purposes
+- NewWSUsingChanWithDefaults: Setup with default options
+- NewWSUsingChan: Full control over connection options
+
+Example usage:
+    ctx := context.Background()
+    options := agent.NewSettingsConfigurationOptions()
+    ws, err := agent.NewWSUsingChanForDemo(ctx, options)
 */
pkg/client/interfaces/v1/options.go (1)

134-163: Consider validating required fields in constructor.

While the default values are appropriate, the constructor could validate or warn about required fields that are left empty.

 func NewSettingsConfigurationOptions() *SettingsConfigurationOptions {
+	klog.V(4).Infof("Creating new SettingsConfigurationOptions. Note: Think.Provider.Type and Think.Model are required fields.")
 	return &SettingsConfigurationOptions{
 		Type: TypeSettingsConfiguration,
 		Audio: Audio{
pkg/client/agent/v1/websocket/new_using_chan.go (2)

36-36: Remove unnecessary gocritic ignore comment.

The gocritic ignore comment appears unnecessary as there's no apparent linting issue to suppress.

-func NewUsingChanWithDefaults(ctx context.Context, options *clientinterfaces.SettingsConfigurationOptions, chans msginterfaces.AgentMessageChan) (*WSChannel, error) { // gocritic:ignore
+func NewUsingChanWithDefaults(ctx context.Context, options *clientinterfaces.SettingsConfigurationOptions, chans msginterfaces.AgentMessageChan) (*WSChannel, error) {

66-109: Enhance error handling and logging.

While the error handling is generally good, consider adding more context to errors and logging connection details.

 func NewUsingChanWithCancel(ctx context.Context, ctxCancel context.CancelFunc, apiKey string, cOptions *clientinterfaces.ClientOptions, tOptions *clientinterfaces.SettingsConfigurationOptions, chans msginterfaces.AgentMessageChan) (*WSChannel, error) {
 	klog.V(6).Infof("agent.New() ENTER\n")
+	defer klog.V(6).Infof("agent.New() LEAVE\n")
 
 	if apiKey != "" {
 		cOptions.APIKey = apiKey
 	}
 	err := cOptions.Parse()
 	if err != nil {
-		klog.V(1).Infof("ClientOptions.Parse() failed. Err: %v\n", err)
-		return nil, err
+		return nil, fmt.Errorf("failed to parse client options: %w", err)
 	}
 	err = tOptions.Check()
 	if err != nil {
-		klog.V(1).Infof("TranscribeOptions.Check() failed. Err: %v\n", err)
-		return nil, err
+		return nil, fmt.Errorf("failed to validate transcribe options: %w", err)
 	}
 
+	klog.V(4).Infof("Initializing WebSocket connection with host: %s", cOptions.Host)
pkg/api/agent/v1/websocket/interfaces/types.go (1)

35-40: Move FunctionCallResponse to the response types section.

The FunctionCallResponse struct appears to be a response type but is placed in the request/input section. Consider moving it to the response types section for better organization and clarity.

examples/agent/websocket/simple/README.md (2)

3-3: Improve readability with concise phrasing.

Consider these style improvements:

  1. Replace "in order to" with "to" for conciseness.
  2. Avoid repetition of "makes use of" by using "uses" instead.

Apply these changes:

-This example uses the Microphone as input in order to detect conversation insights in what is being said.
+This example uses the Microphone as input to detect conversation insights in what is being said.

-That package makes use of the [PortAudio library]
+That package uses the [PortAudio library]

Also applies to: 17-17

🧰 Tools
🪛 LanguageTool

[style] ~3-~3: Consider a shorter alternative to avoid wordiness.
Context: ...is example uses the Microphone as input in order to detect conversation insights in what is...

(IN_ORDER_TO_PREMIUM)


17-17: Add hyphen to compound adjective.

Add a hyphen to "open source" when used as a compound adjective.

Apply this change:

-cross-platform open source audio library
+cross-platform open-source audio library
🧰 Tools
🪛 LanguageTool

[style] ~17-~17: You have already used this phrasing in nearby sentences. Shortening it will avoid wordiness.
Context: ...ned within the repository. That package makes use of the [PortAudio library](http://www.port...

(REP_MAKE_USE_OF)


[uncategorized] ~17-~17: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...rtaudio.com/) which is a cross-platform open source audio library. If you are on Linux, you...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 42c3486 and ede21b1.

📒 Files selected for processing (27)
  • examples/agent/websocket/simple/README.md (1 hunks)
  • examples/agent/websocket/simple/main.go (1 hunks)
  • pkg/api/agent/v1/websocket/chan_default.go (1 hunks)
  • pkg/api/agent/v1/websocket/chan_router.go (1 hunks)
  • pkg/api/agent/v1/websocket/constants.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/constants.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/interfaces.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/types.go (1 hunks)
  • pkg/api/agent/v1/websocket/types.go (1 hunks)
  • pkg/api/live/v1/deprecated.go (0 hunks)
  • pkg/api/prerecorded/v1/deprecated.go (0 hunks)
  • pkg/api/version/agent-version.go (1 hunks)
  • pkg/api/version/constants.go (2 hunks)
  • pkg/api/version/version.go (2 hunks)
  • pkg/client/agent/client.go (1 hunks)
  • pkg/client/agent/init.go (1 hunks)
  • pkg/client/agent/v1/websocket/client_channel.go (1 hunks)
  • pkg/client/agent/v1/websocket/constants.go (1 hunks)
  • pkg/client/agent/v1/websocket/new_using_chan.go (1 hunks)
  • pkg/client/agent/v1/websocket/types.go (1 hunks)
  • pkg/client/common/v1/websocket.go (1 hunks)
  • pkg/client/interfaces/interfaces.go (1 hunks)
  • pkg/client/interfaces/v1/constants.go (1 hunks)
  • pkg/client/interfaces/v1/options.go (1 hunks)
  • pkg/client/interfaces/v1/types-agent.go (1 hunks)
  • pkg/client/listen/deprecated.go (0 hunks)
  • pkg/common/constants.go (1 hunks)
💤 Files with no reviewable changes (3)
  • pkg/api/prerecorded/v1/deprecated.go
  • pkg/api/live/v1/deprecated.go
  • pkg/client/listen/deprecated.go
✅ Files skipped from review due to trivial changes (1)
  • pkg/api/agent/v1/websocket/constants.go
🧰 Additional context used
🪛 LanguageTool
examples/agent/websocket/simple/README.md

[style] ~3-~3: Consider a shorter alternative to avoid wordiness.
Context: ...is example uses the Microphone as input in order to detect conversation insights in what is...

(IN_ORDER_TO_PREMIUM)


[style] ~17-~17: You have already used this phrasing in nearby sentences. Shortening it will avoid wordiness.
Context: ...ned within the repository. That package makes use of the [PortAudio library](http://www.port...

(REP_MAKE_USE_OF)


[uncategorized] ~17-~17: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...rtaudio.com/) which is a cross-platform open source audio library. If you are on Linux, you...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

🪛 GitHub Check: Go Tests
pkg/api/agent/v1/websocket/chan_default.go

[failure] 45-45:
unknown field 'endOfThoughtResponse' in struct literal of type DefaultChanHandler


[failure] 45-45:
undefined: interfacesv1.EndOfThoughtResponse

🪛 GitHub Actions: Tests - Unit
pkg/api/agent/v1/websocket/chan_default.go

[error] 45-45: unknown field 'endOfThoughtResponse' in struct literal of type DefaultChanHandler

🪛 golangci-lint (1.62.2)
examples/agent/websocket/simple/main.go

36-36: undefined: msginterfaces.InjectionRefusedResponse

(typecheck)


132-132: undefined: msginterfaces.InjectionRefusedResponse

(typecheck)


55-55: undefined: msginterfaces.InjectionRefusedResponse

(typecheck)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Lint
🔇 Additional comments (20)
pkg/client/agent/v1/websocket/client_channel.go (3)

25-29: Consider verifying concurrency context usage.
The Connect method reassigns c.ctx and c.ctxCancel with a new context, which is also set in ConnectWithCancel. Verify that no concurrent goroutines are using the old context or referencing the old cancel function, to avoid race conditions or unexpected cancellations.


113-167: Potential performance consideration in the Stream method.
The Stream method repeatedly reads from an io.Reader and writes chunks. If there's a need for higher throughput or partial reads, consider using a pooled buffer or an adaptive chunk size. Otherwise, this approach is straightforward and correct.


243-284: Validate recovered panic handling in ping() method.
The panic recovery logs the error and calls ProcessError. However, subsequent logic within the same goroutine is terminated. Confirm that the overall WebSocket channel or main process can recover fully from these panics.

pkg/api/agent/v1/websocket/chan_router.go (1)

149-164: ProcessGeneric function is well-structured.
The generic approach of taking a message type, printing debug info, and invoking a callback action is clear and maintainable. Good job keeping it consistently logged.

pkg/client/interfaces/v1/constants.go (1)

15-17: LGTM!

The constant follows Go naming conventions and is appropriately placed in the constants block.

pkg/client/interfaces/interfaces.go (1)

15-18: LGTM!

The changes follow the established patterns in the codebase:

  • Factory function is well-documented and follows the factory pattern.
  • Type alias is properly aligned with other type aliases.

Also applies to: 22-22

pkg/common/constants.go (1)

11-12: LGTM!

The constant is well-documented and appropriately placed near the related DefaultHost constant.

pkg/api/agent/v1/websocket/interfaces/interfaces.go (1)

12-26: Well-designed interface for WebSocket message handling!

The interface provides a comprehensive set of methods for handling various agent message types, with consistent naming patterns and appropriate use of channel pointers for bi-directional communication.

pkg/api/version/agent-version.go (2)

12-14: Address API versioning concern.

The TODO comment raises a valid concern about the lack of API versioning. This could lead to breaking changes affecting clients in the future. Consider implementing proper versioning strategy.


30-32: Clarify commented code and add input validation.

  1. The commented-out options parameter suggests incomplete implementation. Please clarify if this is intended for future use.
  2. Consider adding input validation for host, version, and path parameters.
 func GetAgentAPI(ctx context.Context, host, version, path string /*options *interfaces.SettingsConfigurationOptions,*/, args ...interface{}) (string, error) {
+    if host == "" || version == "" || path == "" {
+        return "", fmt.Errorf("host, version, and path must not be empty")
+    }
     return getAPIURL(ctx, "agent", host, version, path, nil, args...)
 }
pkg/api/version/constants.go (1)

20-22: LGTM! Consistent API type definition.

The new APITypeAgent constant and its corresponding APIPathMap entry follow the existing patterns and maintain consistency.

Also applies to: 41-41

pkg/client/agent/v1/websocket/types.go (1)

17-22: LGTM! Clear type aliases for message types.

The type aliases provide a clean mapping to interface types while maintaining semantic meaning.

pkg/client/agent/init.go (1)

23-44: LGTM! Well-structured initialization implementation.

The initialization logic is clean and follows good practices:

  • Clear separation between default and custom initialization
  • Proper encapsulation of initialization options
  • Consistent use of common package for underlying implementation
pkg/client/interfaces/v1/types-agent.go (1)

11-12: Add missing documentation URL.

Replace the "XXXX" placeholder with the actual documentation URL for the live/streaming documentation.

✅ Verification successful

Add the streaming documentation URL: https://developers.deepgram.com/reference/streaming

Replace the "XXXX" placeholder with this URL to maintain consistency with the similar documentation pattern in types-stream.go.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if documentation URL exists in README or other docs
rg -i "live.*streaming.*documentation.*url" README.md docs/

Length of output: 107


Script:

#!/bin/bash
# Find all documentation files and search for relevant patterns
echo "=== Documentation files ==="
fd -e md -e txt -e doc -e docs

echo -e "\n=== Searching for streaming/live documentation references ==="
rg -i "stream|live.*documentation|api.*documentation"

echo -e "\n=== Checking for API documentation patterns ==="
rg -i "api.*reference|swagger|openapi"

Length of output: 27009

pkg/api/version/version.go (1)

31-31: LGTM! WebSocket protocol is correctly set for agent API.

The addition of APITypeAgent to the WebSocket protocol check is appropriate since the agent API uses WebSocket communication.

pkg/client/agent/client.go (1)

46-48: LGTM! Well-structured WebSocket client implementation.

The functions are well-documented with clear input parameters and proper error handling through the underlying implementations.

Also applies to: 91-93

pkg/api/agent/v1/websocket/interfaces/types.go (2)

52-66: LGTM! Well-documented message type struct.

The MessageType struct is well-documented with a clear example of its usage in the comments.


108-108: Address TODO comments about undefined input/output types.

The input and output fields in FunctionCallRequestResponse and FunctionCallingResponse are marked as undefined. Consider defining proper types for these fields instead of using map[string]string.

Would you like me to help define appropriate types for these fields?

Also applies to: 114-114

examples/agent/websocket/simple/main.go (1)

376-378: Verify model name and configuration.

The model name gpt-4o-mini seems incorrect. Please verify the correct model name for the Agent API.

pkg/client/common/v1/websocket.go (1)

209-209: LGTM! Improved websocket connection handling.

The changes enhance the connection logic with better error handling and logging.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (9)
pkg/api/agent/v1/websocket/interfaces/types.go (3)

5-5: Consider a more specific package name.

The package name interfacesv1 is quite generic. Consider using agentinterfaces or wsinterfaces to better reflect its specific purpose within the Agent API WebSocket implementation.


35-40: Move FunctionCallResponse to the response section.

The FunctionCallResponse struct is placed in the request/input section but represents a response type. Consider moving it to the response section for better code organization.


18-21: Add validation for required fields.

Consider adding validation tags or implementing validation methods for required fields in request structs. This would help catch invalid requests early.

For example:

 type UpdateInstructions struct {
-    Type         string `json:"type,omitempty"`
-    Instructions string `json:"instructions,omitempty"`
+    Type         string `json:"type" validate:"required"`
+    Instructions string `json:"instructions" validate:"required"`
 }

Also applies to: 24-27, 30-33

pkg/client/interfaces/v1/types-agent.go (2)

13-18: Consider adding field documentation.

The struct fields would benefit from documentation comments explaining their purpose and constraints. This is especially important for public APIs.

 type SettingsConfigurationOptions struct {
+    // Type specifies the type of configuration message
     Type    string   `json:"type"`
+    // Audio contains the input/output audio configuration
     Audio   Audio    `json:"audio"`
+    // Agent contains the listen/think/speak configuration
     Agent   Agent    `json:"agent"`
+    // Context contains optional message handling and replay settings
     Context *Context `json:"context,omitempty"`
 }

78-82: Consider adding required tags for mandatory fields.

The Agent struct's fields appear to be required based on the JSON structure, but this isn't reflected in the struct tags.

 type Agent struct {
-    Listen Listen `json:"listen"`
-    Think  Think  `json:"think"`
-    Speak  Speak  `json:"speak"`
+    Listen Listen `json:"listen" binding:"required"`
+    Think  Think  `json:"think" binding:"required"`
+    Speak  Speak  `json:"speak" binding:"required"`
 }
pkg/api/agent/v1/websocket/interfaces/interfaces.go (1)

12-28: Consider adding method documentation.

While the interface is well-structured, adding documentation for each method would improve usability. Consider documenting:

  • Purpose of each method
  • Expected usage patterns
  • Why channels are returned as slices
 type AgentMessageChan interface {
+    // GetBinary returns channels that receive raw binary messages
     GetBinary() []*chan *[]byte
+    // GetOpen returns channels that receive connection open events
     GetOpen() []*chan *OpenResponse
     // ... (add similar documentation for other methods)
 }
pkg/api/agent/v1/websocket/interfaces/constants.go (1)

11-12: Consider improving type alias documentation.

The TypeResponse type alias would benefit from more detailed documentation explaining its purpose and relationship to commoninterfaces.TypeResponse.

-// These are the message types that can be received from the live API
+// TypeResponse represents the base type for all Agent API messages.
+// It extends commoninterfaces.TypeResponse to maintain consistency
+// across different parts of the SDK while allowing for agent-specific
+// message handling.
 type TypeResponse commoninterfaces.TypeResponse
pkg/api/agent/v1/websocket/chan_router.go (1)

402-413: Consider adding buffer size for binary channel.

The Binary method sends data to unbuffered channels which could block if receivers are slow. Consider adding a buffer to prevent potential deadlocks.

Apply this diff to add buffering:

func (r *ChanRouter) Binary(byMsg []byte) error {
    klog.V(6).Infof("router.Binary ENTER\n")

    klog.V(5).Infof("Binary Message:\n%s...\n", hex.EncodeToString(byMsg[:20]))
+    // Use buffered channels to prevent blocking
+    const bufferSize = 10
+    for _, ch := range r.binaryChan {
+        select {
+        case *ch <- &byMsg:
+            // Message sent successfully
+        default:
+            klog.V(1).Infof("Binary channel buffer full, dropping message\n")
+        }
+    }

-    for _, ch := range r.binaryChan {
-        *ch <- &byMsg
-    }

    klog.V(6).Infof("router.Binary LEAVE\n")
    return nil
}
pkg/api/agent/v1/websocket/chan_default.go (1)

157-170: Improve file handling in debug mode.

The file handling in the binary channel processing could be improved to ensure proper cleanup and error handling.

Apply this diff to improve file handling:

if dch.debugWebsocketVerbose {
    fmt.Printf("Dumping to verbose.wav\n")
-    file, err := os.OpenFile("verbose.wav", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
-    if err != nil {
-        fmt.Printf("Failed to open file. Err: %v\n", err)
-        continue
-    }
-
-    _, err = file.Write(*br)
-    file.Close()
-
-    if err != nil {
-        fmt.Printf("Failed to write to file. Err: %v\n", err)
-        continue
-    }
+    func() {
+        file, err := os.OpenFile("verbose.wav", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644)
+        if err != nil {
+            klog.V(1).Infof("Failed to open file. Err: %v\n", err)
+            return
+        }
+        defer file.Close()
+
+        if _, err = file.Write(*br); err != nil {
+            klog.V(1).Infof("Failed to write to file. Err: %v\n", err)
+            return
+        }
+    }()
}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ede21b1 and 9d0bacf.

📒 Files selected for processing (16)
  • README.md (3 hunks)
  • pkg/api/agent/v1/websocket/chan_default.go (1 hunks)
  • pkg/api/agent/v1/websocket/chan_router.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/constants.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/interfaces.go (1 hunks)
  • pkg/api/agent/v1/websocket/interfaces/types.go (1 hunks)
  • pkg/api/agent/v1/websocket/types.go (1 hunks)
  • pkg/client/interfaces/v1/types-agent.go (1 hunks)
  • tests/daily_test/prerecorded_test.go (1 hunks)
  • tests/edge_cases/cancel/main.go (1 hunks)
  • tests/edge_cases/failed_retry/main.go (1 hunks)
  • tests/edge_cases/keepalive/main.go (1 hunks)
  • tests/edge_cases/reconnect_client/main.go (1 hunks)
  • tests/edge_cases/timeout/main.go (1 hunks)
  • tests/response_data/642c86c60eedbc4af873632b86d68164149599cf97131d81a63a2711f0563d37-response.json (1 hunks)
  • tests/response_data/bfae00d50d521f470ff9d1943f32225fcfeffe51eff47984886930b71fae0929-response.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/api/agent/v1/websocket/types.go
🧰 Additional context used
📓 Learnings (1)
pkg/api/agent/v1/websocket/chan_default.go (3)
Learnt from: jpvajda
PR: deepgram/deepgram-go-sdk#274
File: pkg/api/agent/v1/websocket/chan_default.go:20-59
Timestamp: 2025-01-31T17:28:31.839Z
Learning: The `endOfThoughtResponse` field exists in DefaultChanHandler but its type `EndOfThoughtResponse` is not defined in the interfaces package, causing compilation errors.
Learnt from: jpvajda
PR: deepgram/deepgram-go-sdk#274
File: pkg/api/agent/v1/websocket/chan_default.go:20-59
Timestamp: 2025-01-31T17:28:31.839Z
Learning: The DefaultChanHandler struct in the Agent API does not include an endOfThoughtResponse field, and any initialization of this field in NewDefaultChanHandler is incorrect.
Learnt from: jpvajda
PR: deepgram/deepgram-go-sdk#274
File: pkg/api/agent/v1/websocket/chan_default.go:20-59
Timestamp: 2025-01-31T17:28:31.839Z
Learning: The `EndOfThoughtResponse` type and `endOfThoughtResponse` field are not part of the Agent API implementation in the Deepgram Go SDK.
🪛 LanguageTool
README.md

[misspelling] ~211-~211: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ...peech-to-text/rest/file/main.go) - From an URL - [examples/speech-to-text/rest/url...

(EN_A_VS_AN)

🪛 GitHub Actions: Check - mdlint
README.md

[error] 203-203: MD026/no-trailing-punctuation: Trailing punctuation ':' in heading


[error] 208-208: MD026/no-trailing-punctuation: Trailing punctuation ':' in heading


[error] 214-214: MD026/no-trailing-punctuation: Trailing punctuation ':' in heading

🪛 GitHub Check: Lint
pkg/api/agent/v1/websocket/chan_default.go

[failure] 63-63:
hugeParam: dch is heavy (128 bytes); consider passing it by pointer (gocritic)


[failure] 68-68:
hugeParam: dch is heavy (128 bytes); consider passing it by pointer (gocritic)


[failure] 73-73:
hugeParam: dch is heavy (128 bytes); consider passing it by pointer (gocritic)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Go Tests
🔇 Additional comments (13)
tests/edge_cases/keepalive/main.go (1)

36-36: LGTM! Verify channel-based implementation across the codebase.

The change to NewWebSocketUsingChan aligns with the broader refactoring to standardize WebSocket client creation methods.

Let's verify the consistency of this change across the codebase:

✅ Verification successful

✅ Channel-based WebSocket implementation verified across codebase

The migration to channel-based WebSocket client creation is complete and consistent. All relevant code paths are using the new methods with no remnants of the old implementation.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for any remaining old WebSocket client creation methods
# that haven't been migrated to the new channel-based approach

# Search for old method names
echo "Checking for old method usage..."
rg "NewWebSocket[^U]" --type go

# Search for new method names to confirm migration
echo "Verifying new method adoption..."
rg "NewWebSocketUsingChan|NewWSUsingChan" --type go

Length of output: 7380

tests/edge_cases/failed_retry/main.go (1)

37-37: LGTM! Method change maintains test functionality.

The update to NewWebSocketUsingChan is consistent with the standardization effort while preserving the test's purpose of demonstrating retry behavior.

tests/edge_cases/timeout/main.go (1)

31-31: Consider consistent naming across the codebase.

While the change to channel-based implementation is good, the method name uses 'WS' instead of 'WebSocket' used in other files. Consider standardizing to either NewWebSocketUsingChanWithDefaults or NewWSUsingChanWithDefaults across all files for consistency.

Let's check the naming patterns across the codebase:

tests/edge_cases/cancel/main.go (1)

39-39: LGTM! Proper context cancellation handling maintained.

The update to NewWebSocketUsingChanWithCancel maintains proper context cancellation while aligning with the new channel-based implementation.

tests/edge_cases/reconnect_client/main.go (1)

144-144: LGTM! Method name change aligns with SDK's new WebSocket client creation pattern.

The change from NewWebSocket to NewWebSocketUsingCallback makes the callback-based nature of the client more explicit while maintaining the same functionality.

Let's verify this change is consistent across the codebase:

✅ Verification successful

✅ Verified: WebSocket client creation methods are consistently updated across the codebase

The change from NewWebSocket to NewWebSocketUsingCallback is part of a complete and consistent update across the codebase. All WebSocket client instantiations now explicitly indicate their message handling approach (callback or channel-based).

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the consistent usage of new WebSocket client creation methods
# and ensure no old method calls remain.

echo "Checking for old WebSocket client creation methods..."
rg "NewWebSocket[^U]" --type go

echo "Verifying consistent usage of new methods..."
rg "NewWebSocketUsing(Callback|Chan)" --type go

Length of output: 3882

tests/response_data/bfae00d50d521f470ff9d1943f32225fcfeffe51eff47984886930b71fae0929-response.json (1)

1-1: LGTM! Test response data updates maintain valid format and values.

The changes to request_id, timestamp, and confidence values are valid updates to the test data that maintain the expected response structure.

pkg/api/agent/v1/websocket/interfaces/types.go (2)

52-66: LGTM! Well-documented message type discriminator.

The MessageType struct is well-documented with a clear example, making it easy to understand its purpose in message unmarshalling.


104-109: Address TODOs and improve type definitions for function calls.

The function call related structs have undefined types marked with TODOs:

  1. In FunctionCallRequestResponse, Input is using map[string]string
  2. In FunctionCallingResponse, Output is using map[string]string

Consider:

  1. Defining proper types for function inputs and outputs instead of using generic string maps
  2. Adding validation for required fields
  3. Adding documentation about expected input/output formats

Example improvement:

// FunctionInput represents the structured input for a function call
type FunctionInput struct {
    Parameters map[string]interface{} `json:"parameters" validate:"required"`
    Schema     string                 `json:"schema,omitempty"`
}

type FunctionCallRequestResponse struct {
    Type           string       `json:"type" validate:"required"`
    FunctionName   string       `json:"function_name" validate:"required"`
    FunctionCallID string       `json:"function_call_id" validate:"required"`
    Input          FunctionInput `json:"input" validate:"required"`
}

Would you like me to help define proper types for function inputs and outputs?

Also applies to: 112-115

pkg/client/interfaces/v1/types-agent.go (1)

11-11: Add the missing documentation link.

The TODO placeholder "XXXX" should be replaced with the actual documentation URL.

✅ Verification successful

Replace TODO with the live streaming documentation URL

Replace the XXXX placeholder with: https://developers.deepgram.com/docs/live-streaming-audio-transcription

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if documentation URL exists in README or docs
rg -i "agent.*api.*documentation|streaming.*documentation" README.md docs/

Length of output: 746


Script:

#!/bin/bash
# Check the content of the file and look for similar patterns
echo "=== File Content ==="
cat pkg/client/interfaces/v1/types-agent.go

echo -e "\n=== Similar TODOs ==="
rg "TODO.*XXXX" -A 2 -B 2

Length of output: 2781

tests/daily_test/prerecorded_test.go (1)

32-32: LGTM!

The grammatical improvement in the test constant makes the text more readable.

pkg/api/agent/v1/websocket/interfaces/interfaces.go (1)

13-27: Well-designed interface for message routing!

The interface effectively supports multiple subscribers through channel slices and provides comprehensive coverage of all message types.

pkg/api/agent/v1/websocket/interfaces/constants.go (1)

15-40: Well-organized message type constants!

The clear separation between client and server message types, along with consistent naming patterns, makes the code maintainable and easy to understand.

tests/response_data/642c86c60eedbc4af873632b86d68164149599cf97131d81a63a2711f0563d37-response.json (1)

1-1: LGTM!

The test response data is well-structured and contains valid JSON with appropriate metadata and results sections.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
README.md (1)

275-277: Improve test command documentation.

The test command example could be more specific and helpful. Consider providing the complete command with an example test file.

-```bash
-go run filename
-```
+```bash
+# Run tests in a specific directory
+go test ./tests/unit_test/
+
+# Run a specific test file
+go test ./tests/unit_test/client_test.go
+```
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9d0bacf and d6f1755.

📒 Files selected for processing (1)
  • README.md (3 hunks)
🧰 Additional context used
🪛 LanguageTool
README.md

[misspelling] ~211-~211: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ...peech-to-text/rest/file/main.go) - From an URL - [examples/speech-to-text/rest/url...

(EN_A_VS_AN)

🔇 Additional comments (2)
README.md (2)

211-211: Fix grammar: Use "a URL" instead of "an URL".

The article "an" is used before words that begin with a vowel sound. Since "URL" is pronounced starting with a consonant sound ("you"), it should be preceded by "a" instead of "an".

🧰 Tools
🪛 LanguageTool

[misspelling] ~211-~211: Use “a” instead of ‘an’ if the following word doesn’t start with a vowel sound, e.g. ‘a sentence’, ‘a university’.
Context: ...peech-to-text/rest/file/main.go) - From an URL - [examples/speech-to-text/rest/url...

(EN_A_VS_AN)


199-202: LGTM! Well-structured Agent section.

The new Agent section is well-placed and aligns with the PR's objective of implementing the Agent API.

@jpvajda
Copy link
Contributor Author

jpvajda commented Jan 31, 2025

Still need to add SettingsApplied

@naomi-lgbt naomi-lgbt changed the title Feat/sts agent api ga Release voice agent API Feb 3, 2025
@naomi-lgbt naomi-lgbt merged commit 404caa4 into main Feb 3, 2025
4 checks passed
@naomi-lgbt naomi-lgbt deleted the feat/sts-agent-api-ga branch February 3, 2025 17:26
@coderabbitai coderabbitai bot mentioned this pull request Feb 8, 2025
8 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants