Compare commits

..

18 Commits

Author SHA1 Message Date
github-actions[bot]
005f2b7db5 Update version to v1.4.105 and commit 2024-11-19 08:55:31 +00:00
Eugen Eisler
67840605fc Merge pull request #1147 from mattjoyce/adhoc-pattern-feature
refactor: unify pattern loading and variable handling
2024-11-19 09:54:47 +01:00
Matt Joyce
1f07ea25a2 refactor: unify pattern loading and variable handling
- Stronger separation of concerns between chatter.go and patterns.go
- Consolidate pattern loading logic into GetPattern method
- Support both file and database patterns through single interface
- Maintain API compatibility with Storage interface
- Handle variable substitution in one place
- Keep backward compatibility for REST API through Get method

The changes enable cleaner pattern handling while maintaining
existing interfaces and adding file-based pattern support.
2024-11-19 10:31:06 +11:00
Eugen Eisler
08f4e28342 Merge pull request #1146 from mrwadams/patch-1
Add summarize_meeting
2024-11-18 23:22:42 +01:00
github-actions[bot]
97666d9537 Update version to v1.4.104 and commit 2024-11-18 22:21:31 +00:00
Eugen Eisler
f7733f932b Merge pull request #1142 from mattjoyce/adhoc-pattern-feature
feat: add file-based pattern support
2024-11-18 23:20:34 +01:00
Matt Adams
20a039a8ab Add summarize_meeting
# What this Pull Request (PR) does

Add a new pattern to create a meeting summary from an audio transcript.

The pattern outputs the following sections (where relevant):
- Key Points
- Tasks
- Decisions
- Next Steps
2024-11-18 20:37:47 +00:00
github-actions[bot]
29856e4749 Update version to v1.4.103 and commit 2024-11-18 09:13:56 +00:00
Eugen Eisler
47a797e884 Merge pull request #1133 from igophper/fix_gin_logger
fix: fix default gin
2024-11-18 10:13:12 +01:00
Eugen Eisler
d4079aa543 Merge pull request #1129 from xyb/screenshoot
add a screenshot of fabric
2024-11-18 10:12:59 +01:00
github-actions[bot]
62eb837422 Update version to v1.4.102 and commit 2024-11-18 09:12:25 +00:00
Eugen Eisler
8d81f8d3aa Merge pull request #1143 from mariozig/patch-1
Update docker image
2024-11-18 10:11:39 +01:00
Mario Zigliotto
e8acf9ca07 Update docker image 2024-11-17 10:48:38 -08:00
Matt Joyce
af4752d324 feat: add file-based pattern support
Allow patterns to be loaded directly from files using explicit path prefixes
(~/, ./, /, or \). This enables easier testing and iteration of patterns
without requiring installation into the fabric config structure.

- Supports relative paths (./pattern.txt, ../pattern.txt)
- Supports home directory expansion (~/patterns/test.txt)
- Supports absolute paths
- Maintains backwards compatibility with named patterns
- Requires explicit path markers to distinguish from pattern names

Example usage:
  fabric --pattern ./draft-pattern.txt
  fabric --pattern ~/patterns/my-pattern.txt
  fabric --pattern ../../shared-patterns/test.txt
2024-11-17 14:39:49 +11:00
github-actions[bot]
fbd1fbfc67 Update version to v1.4.101 and commit 2024-11-15 16:04:16 +00:00
Eugen Eisler
d1fe826f14 improve logging for missing setup steps 2024-11-15 17:03:13 +01:00
江杭辉
2ae26dc2a6 fix: fix default gin 2024-11-13 18:02:57 +08:00
Xie Yanbo
c396288ca7 add a screenshot of fabric 2024-11-13 11:37:01 +08:00
10 changed files with 139 additions and 35 deletions

View File

@@ -1,5 +1,5 @@
# Use official golang image as builder
FROM golang:1.22.5-alpine AS builder
FROM golang:1.23.3-alpine AS builder
# Set working directory
WORKDIR /app
@@ -38,4 +38,4 @@ EXPOSE 8080
# Run the binary with debug output
ENTRYPOINT ["/fabric"]
CMD ["--serve"]
CMD ["--serve"]

View File

@@ -25,6 +25,7 @@
[Helper Apps](#helper-apps) •
[Meta](#meta)
![Screenshot of fabric](images/fabric-summarize.png)
</div>
## Navigation

View File

@@ -72,6 +72,7 @@ func (o *Chatter) Send(request *common.ChatRequest, opts *common.ChatOptions) (s
return
}
func (o *Chatter) BuildSession(request *common.ChatRequest, raw bool) (session *fsdb.Session, err error) {
if request.SessionName != "" {
var sess *fsdb.Session
@@ -98,19 +99,17 @@ func (o *Chatter) BuildSession(request *common.ChatRequest, raw bool) (session *
contextContent = ctx.Content
}
var patternContent string
if request.PatternName != "" {
var pattern *fsdb.Pattern
if pattern, err = o.db.Patterns.GetApplyVariables(request.PatternName, request.PatternVariables); err != nil {
err = fmt.Errorf("could not find pattern %s: %v", request.PatternName, err)
return
}
if pattern.Pattern != "" {
pattern, err := o.db.Patterns.GetApplyVariables(request.PatternName, request.PatternVariables)
if err != nil {
return nil, fmt.Errorf("could not get pattern %s: %v", request.PatternName, err)
}
patternContent = pattern.Pattern
}
}
systemMessage := strings.TrimSpace(contextContent) + strings.TrimSpace(patternContent)
if request.Language != "" {
systemMessage = fmt.Sprintf("%s. Please use the language '%s' for the output.", systemMessage, request.Language)

View File

@@ -221,9 +221,15 @@ func (o *PluginRegistry) GetChatter(model string, modelContextLength int, stream
}
if ret.vendor == nil {
var errMsg string
if defaultModel == "" || defaultVendor == "" {
errMsg = "Please run, fabric --setup, and select default model and vendor."
} else {
errMsg = "could not find vendor."
}
err = fmt.Errorf(
"could not find vendor.\n Model = %s\n Model = %s\n Vendor = %s",
model, defaultModel, defaultVendor)
" Requested Model = %s\n Default Model = %s\n Default Vendor = %s.\n\n%s",
model, defaultModel, defaultVendor, errMsg)
return
}
return

BIN
images/fabric-summarize.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 KiB

View File

@@ -0,0 +1,49 @@
# IDENTITY and PURPOSE
You are an AI assistant specialized in analyzing meeting transcripts and extracting key information. Your goal is to provide comprehensive yet concise summaries that capture the essential elements of meetings in a structured format.
# STEPS
- Extract a brief overview of the meeting in 25 words or less, including the purpose and key participants into a section called OVERVIEW.
- Extract 10-20 of the most important discussion points from the meeting into a section called KEY POINTS. Focus on core topics, debates, and significant ideas discussed.
- Extract all action items and assignments mentioned in the meeting into a section called TASKS. Include responsible parties and deadlines where specified.
- Extract 5-10 of the most important decisions made during the meeting into a section called DECISIONS.
- Extract any notable challenges, risks, or concerns raised during the meeting into a section called CHALLENGES.
- Extract all deadlines, important dates, and milestones mentioned into a section called TIMELINE.
- Extract all references to documents, tools, projects, or resources mentioned into a section called REFERENCES.
- Extract 5-10 of the most important follow-up items or next steps into a section called NEXT STEPS.
# OUTPUT INSTRUCTIONS
- Only output Markdown.
- Write the KEY POINTS bullets as exactly 15 words.
- Write the TASKS bullets as exactly 15 words.
- Write the DECISIONS bullets as exactly 15 words.
- Write the NEXT STEPS bullets as exactly 15 words.
- Use bulleted lists for all sections, not numbered lists.
- Do not repeat information across sections.
- Do not start items with the same opening words.
- If information for a section is not available in the transcript, write "No information available".
- Do not include warnings or notes; only output the requested sections.
- Format each section header in bold using markdown.
# INPUT
INPUT:

View File

@@ -1 +1 @@
"1.4.100"
"1.4.105"

View File

@@ -13,7 +13,49 @@ type PatternsEntity struct {
UniquePatternsFilePath string
}
func (o *PatternsEntity) Get(name string) (ret *Pattern, err error) {
// Pattern represents a single pattern with its metadata
type Pattern struct {
Name string
Description string
Pattern string
}
// main entry point for getting patterns from any source
func (o *PatternsEntity) GetApplyVariables(source string, variables map[string]string) (*Pattern, error) {
var pattern *Pattern
var err error
// Determine if this is a file path
isFilePath := strings.HasPrefix(source, "\\") ||
strings.HasPrefix(source, "/") ||
strings.HasPrefix(source, "~") ||
strings.HasPrefix(source, ".")
if isFilePath {
pattern, err = o.getFromFile(source)
} else {
pattern, err = o.getFromDB(source)
}
if err != nil {
return nil, err
}
return o.applyVariables(pattern, variables), nil
}
// handles all variable substitution
func (o *PatternsEntity) applyVariables(pattern *Pattern, variables map[string]string) *Pattern {
if variables != nil && len(variables) > 0 {
for variableName, value := range variables {
pattern.Pattern = strings.ReplaceAll(pattern.Pattern, variableName, value)
}
}
return pattern
}
// retrieves a pattern from the database by name
func (o *PatternsEntity) getFromDB(name string) (ret *Pattern, err error) {
patternPath := filepath.Join(o.Dir, name, o.SystemPatternFile)
var pattern []byte
@@ -29,21 +71,6 @@ func (o *PatternsEntity) Get(name string) (ret *Pattern, err error) {
return
}
// GetApplyVariables finds a pattern by name and returns the pattern as an entry or an error
func (o *PatternsEntity) GetApplyVariables(name string, variables map[string]string) (ret *Pattern, err error) {
if ret, err = o.Get(name); err != nil {
return
}
if variables != nil && len(variables) > 0 {
for variableName, value := range variables {
ret.Pattern = strings.ReplaceAll(ret.Pattern, variableName, value)
}
}
return
}
func (o *PatternsEntity) PrintLatestPatterns(latestNumber int) (err error) {
var contents []byte
if contents, err = os.ReadFile(o.UniquePatternsFilePath); err != nil {
@@ -61,8 +88,30 @@ func (o *PatternsEntity) PrintLatestPatterns(latestNumber int) (err error) {
return
}
type Pattern struct {
Name string
Description string
Pattern string
// reads a pattern from a file path and returns it
func (o *PatternsEntity) getFromFile(pathStr string) (*Pattern, error) {
// Handle home directory expansion
if strings.HasPrefix(pathStr, "~/") {
homedir, err := os.UserHomeDir()
if err != nil {
return nil, fmt.Errorf("could not get home directory: %v", err)
}
pathStr = filepath.Join(homedir, pathStr[2:])
}
content, err := os.ReadFile(pathStr)
if err != nil {
return nil, fmt.Errorf("could not read pattern file %s: %v", pathStr, err)
}
return &Pattern{
Name: pathStr,
Pattern: string(content),
}, nil
}
// Get required for Storage interface
func (o *PatternsEntity) Get(name string) (*Pattern, error) {
// Use GetPattern with no variables
return o.GetApplyVariables(name, nil)
}

View File

@@ -6,7 +6,7 @@ import (
)
func Serve(registry *core.PluginRegistry, address string) (err error) {
r := gin.Default()
r := gin.New()
// Middleware
r.Use(gin.Logger())

View File

@@ -1,3 +1,3 @@
package main
var version = "v1.4.100"
var version = "v1.4.105"