Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
cache: true
- name: gofumpt
run: |
go install mvdan.cc/gofumpt@v0.7.0
go install mvdan.cc/gofumpt@v0.10.0
out=$(gofumpt -l .)
if [ -n "$out" ]; then
echo "::error::gofumpt would reformat:"
Expand Down Expand Up @@ -209,7 +209,7 @@ jobs:
name: duplication
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: '24'
Expand Down
30 changes: 12 additions & 18 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,6 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · Versioning:

---

## [0.2.1](https://github.com/GrayCodeAI/eyrie/compare/v0.1.0...v0.2.1) (2026-05-16)


### Bug Fixes

* flaky test TestOpenAIStreamChat_MultipleToolCalls order assertion ([f5e7f3b](https://github.com/GrayCodeAI/eyrie/commit/f5e7f3b21d092886971b092027a8184c6fd8a385))
* gofumpt formatting ([7de54e3](https://github.com/GrayCodeAI/eyrie/commit/7de54e352170e456bbfe9bfee9b79e244210db72))
* gofumpt formatting + go mod tidy ([8bd58dc](https://github.com/GrayCodeAI/eyrie/commit/8bd58dcea346eb9df8d13d9020d936df2ceba1b5))
* remaining errcheck issues ([a0a746a](https://github.com/GrayCodeAI/eyrie/commit/a0a746aa95cd9acdf5d29ef836985e13ab864ba1))
* resolve all lint errors (bodyclose, errcheck, gocritic, noctx, unlambda) ([566980f](https://github.com/GrayCodeAI/eyrie/commit/566980f39bdd7ebba072ce4c17bc19bc0f3cf2a0))
* syntax errors in test files ([51809bc](https://github.com/GrayCodeAI/eyrie/commit/51809bcb181a27eb344a1493501f59c593b3065b))
* upgrade Go from 1.26.1 to 1.26.3 to patch stdlib vulnerabilities ([f4a6594](https://github.com/GrayCodeAI/eyrie/commit/f4a65944a6f777947071c9b870a6f2c4f74891be))


### Tests

* fix flaky TestBackoffDelay by accounting for jitter ([5fa573f](https://github.com/GrayCodeAI/eyrie/commit/5fa573fe3ec8074a84bf81d10ea59837bf40b7bc))

## [Unreleased]

### Added — Round 3 ecosystem improvements (2026-06-06)
Expand Down Expand Up @@ -93,6 +75,18 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · Versioning:
GitHub Security Advisories, questions to Discussions, blocks blank
issues.

### Fixed (2026-05-16)
- Flaky test `TestOpenAIStreamChat_MultipleToolCalls` order assertion ([f5e7f3b](https://github.com/GrayCodeAI/eyrie/commit/f5e7f3b21d092886971b092027a8184c6fd8a385))
- gofumpt formatting ([7de54e3](https://github.com/GrayCodeAI/eyrie/commit/7de54e352170e456bbfe9bfee9b79e244210db72))
- gofumpt formatting + `go mod tidy` ([8bd58dc](https://github.com/GrayCodeAI/eyrie/commit/8bd58dcea346eb9df8d13d9020d936df2ceba1b5))
- Remaining errcheck issues ([a0a746a](https://github.com/GrayCodeAI/eyrie/commit/a0a746aa95cd9acdf5d29ef836985e13ab864ba1))
- Resolve all lint errors (bodyclose, errcheck, gocritic, noctx, unlambda) ([566980f](https://github.com/GrayCodeAI/eyrie/commit/566980f39bdd7ebba072ce4c17bc19bc0f3cf2a0))
- Syntax errors in test files ([51809bc](https://github.com/GrayCodeAI/eyrie/commit/51809bcb181a27eb344a1493501f59c593b3065b))
- Upgrade Go from 1.26.1 to 1.26.3 to patch stdlib vulnerabilities ([f4a6594](https://github.com/GrayCodeAI/eyrie/commit/f4a65944a6f777947071c9b870a6f2c4f74891be))

### Tests (2026-05-16)
- Fix flaky `TestBackoffDelay` by accounting for jitter ([5fa573f](https://github.com/GrayCodeAI/eyrie/commit/5fa573fe3ec8074a84bf81d10ea59837bf40b7bc))

## [0.1.0] — 2026-05-12

> Initial release.
Expand Down
3 changes: 2 additions & 1 deletion client/callbacks.go
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,8 @@ func (cp *CallbackProvider) safeCall(method string, fn func()) {
logger := cp.logger
cp.mu.RUnlock()
if logger != nil {
logger.Error("eyrie: callback panic recovered",
logger.Error(
"eyrie: callback panic recovered",
"method", method,
"provider", cp.inner.Name(),
"panic", r,
Expand Down
27 changes: 18 additions & 9 deletions client/moderation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import (

func TestModerationProvider_AllowsSafe(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithBlockedPatterns([]string{"(?i)forbidden"}),
WithModerationMaxTokens(1000),
)
Expand All @@ -29,7 +30,8 @@ func TestModerationProvider_AllowsSafe(t *testing.T) {

func TestModerationProvider_BlocksPattern(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithBlockedPatterns([]string{`(?i)\bforbidden\b`}),
)

Expand All @@ -48,7 +50,8 @@ func TestModerationProvider_BlocksPattern(t *testing.T) {

func TestModerationProvider_TokenLimit(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithModerationMaxTokens(5),
)

Expand All @@ -68,7 +71,8 @@ func TestModerationProvider_TokenLimit(t *testing.T) {

func TestModerationProvider_TokenLimitAllowsUnderLimit(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithModerationMaxTokens(100),
)

Expand All @@ -84,7 +88,8 @@ func TestModerationProvider_TokenLimitAllowsUnderLimit(t *testing.T) {

func TestModerationProvider_CustomChecker(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithCustomChecker(func(text string) error {
if strings.Contains(strings.ToLower(text), "banned") {
return errors.New("custom rule: banned word detected")
Expand All @@ -108,7 +113,8 @@ func TestModerationProvider_CustomChecker(t *testing.T) {

func TestModerationProvider_CustomCheckerAllows(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithCustomChecker(func(text string) error {
return nil
}),
Expand All @@ -123,7 +129,8 @@ func TestModerationProvider_CustomCheckerAllows(t *testing.T) {

func TestModerationProvider_StreamChat(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithBlockedPatterns([]string{`(?i)forbidden`}),
WithModerationMaxTokens(1000),
)
Expand Down Expand Up @@ -152,7 +159,8 @@ func TestModerationProvider_StreamChat(t *testing.T) {

func TestModerationProvider_StreamChatBlocked(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithBlockedPatterns([]string{`(?i)forbidden`}),
)

Expand All @@ -168,7 +176,8 @@ func TestModerationProvider_StreamChatBlocked(t *testing.T) {

func TestModerationProvider_ContentParts(t *testing.T) {
mock := NewMockProvider(MockModeEcho)
mp := NewModerationProvider(mock,
mp := NewModerationProvider(
mock,
WithBlockedPatterns([]string{`(?i)secret`}),
)

Expand Down
6 changes: 4 additions & 2 deletions client/tracing.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ func (tp *TracingProvider) Ping(ctx context.Context) error {
}

func (tp *TracingProvider) Chat(ctx context.Context, messages []EyrieMessage, opts ChatOptions) (*EyrieResponse, error) {
ctx, span := clientTracer.Start(ctx, "provider.Chat",
ctx, span := clientTracer.Start(
ctx, "provider.Chat",
trace.WithSpanKind(trace.SpanKindClient),
trace.WithAttributes(
attribute.String("provider.name", tp.inner.Name()),
Expand Down Expand Up @@ -67,7 +68,8 @@ func (tp *TracingProvider) Chat(ctx context.Context, messages []EyrieMessage, op
}

func (tp *TracingProvider) StreamChat(ctx context.Context, messages []EyrieMessage, opts ChatOptions) (*StreamResult, error) {
ctx, span := clientTracer.Start(ctx, "provider.StreamChat",
ctx, span := clientTracer.Start(
ctx, "provider.StreamChat",
trace.WithSpanKind(trace.SpanKindClient),
trace.WithAttributes(
attribute.String("provider.name", tp.inner.Name()),
Expand Down
Loading