google / google/dotprompt

[FR] Add embed.FS Support for Search Directory in the Go implementation

Open
#314 1 comment 5 reactions 0 assignees View on GitHub
feature
Dominant language
Starlark
Stars
563
Forks
68
Avg merge
6m
Merged PRs (30d)
2

Description

## Summary
Add support for using Go's `embed.FS` as a search directory source in dotprompt, allowing prompts to be embedded directly into Go binaries at compile time.

## Motivation
Currently, dotprompt requires prompts to be loaded from the filesystem at runtime. This creates several challenges:

- **Deployment complexity**: Prompts must be distributed alongside binaries
- **Runtime dependencies**: Applications depend on external files being present
- **Distribution concerns**: Risk of missing or modified prompt files in production
- **Binary portability**: Single-file deployments are not possible when prompts are external

Using `embed.FS` would allow developers to bundle prompts directly into their Go binaries, eliminating these issues and enabling truly self-contained applications.

## Proposed Solution
Add a new method or configuration option that accepts an `embed.FS` parameter as the search directory source.

### API Design Options

**Option 1: New constructor method**
```go
//go:embed prompts/*.prompt
var promptFS embed.FS

// New method accepting embed.FS
// NewPromptManagerFromEmbedFS(fs.FS, string) dotprompt.PromptManager
promptManager := dotprompt.NewPromptManagerFromEmbedFS(promptFS, "prompts")
```

## Implementation Considerations

- `embed.FS` implements the `fs.FS` interface, so using `fs.FS` as the parameter type would provide maximum flexibility
- The embedded filesystem is read-only, which aligns well with production use cases
- Path handling should work consistently between regular filesystem and embedded filesystem

## Use Cases

1. **Production deployments**: Single binary with all prompts embedded
2. **Containerized applications**: Smaller, simpler container images
3. **CLI tools**: Self-contained executables with embedded prompt templates
4. **Testing**: Reliable test fixtures that don't depend on external files

## Example Usage

```go
package main

import (
_ "embed"
"github.com/firebase/genkit/go/dotprompt"
)

//go:embed prompts/*.prompt
var prompts embed.FS

func main() {
promptManager := dotprompt.NewPromptManagerFromEmbedFS(prompts, "prompts")
promptFile := promptManager.GetPromptFile("example")

// Use prompt...
}
```

## Acceptance Criteria

- [ ] Support for `embed.FS` as a prompt source
- [ ] Consistent API with existing filesystem-based loading
- [ ] Proper error handling for embedded filesystem operations
- [ ] Documentation and examples showing embed.FS usage
- [ ] Compatibility with existing filesystem-based usage
- [ ] Unit tests covering embedded filesystem scenarios

## Additional Notes

This feature would complement the existing filesystem-based approach rather than replace it. Developers could choose the approach that best fits their deployment model - embedded for production, filesystem-based for development with hot-reloading.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.