Skip to content

Commit 34010bf

Browse files
authored
feat!: rename eyrie to flux, reset version to 0.0.1 (#120)
- Module path: github.com/GrayCodeAI/eyrie -> github.com/GrayCodeAI/flux - All packages, docs, SDKs, CI workflows, and issue templates renamed - Env-var contract: HAWK_CUSTOM_HEADERS -> FLUX_CUSTOM_HEADERS, HAWK_SMALL_FAST_MODEL -> FLUX_SMALL_FAST_MODEL, ___HAWK_STORAGE_PROBE___ -> ___FLUX_STORAGE_PROBE___ (hawk does not consume any of these; EXPORT_HAWK_FIXTURE kept as the genuine hawk/internal/catalogtest cross-repo contract) - .env.example rewritten to the real env contract (dropped phantom FLUX_API_KEY / FLUX_ALLOW_INSECURE_PUBLIC_API, documented actual FLUX_* vars) - Logo redesigned for the flux identity: flow arcs + bolt, no hawk/nest artwork, no pink/red accents - VERSION and SDK/OpenAPI versions reset to 0.0.1; CHANGELOG updated - Makefile drops binary LDFLAGS (flux is a library; version embedded from the VERSION file) BREAKING CHANGE: module path changed; consumers must update imports and re-pin.
1 parent 6c0ba77 commit 34010bf

432 files changed

Lines changed: 2796 additions & 2851 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.env.example‎

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
1-
# eyrie environment variables — copy to .env and fill in
2-
EYRIE_API_KEY=
3-
EYRIE_ALLOW_INSECURE_PUBLIC_API=false
1+
# flux environment variables — copy to .env and fill in
2+
3+
# Provider API keys (or store them in the OS keychain — see
4+
# docs/guides/CREDENTIAL-SETUP-FLOW.md)
5+
FLUX_API_KEY=
46
OPENAI_API_KEY=
57
ANTHROPIC_API_KEY=
68
GEMINI_API_KEY=
79
OPENROUTER_API_KEY=
810
CANOPYWAVE_API_KEY=
911
XAI_API_KEY=
1012
ZAI_API_KEY=
13+
14+
# Default model overrides
1115
OPENAI_MODEL=gpt-4o
1216
ANTHROPIC_MODEL=claude-sonnet-4-5
1317
GEMINI_MODEL=gemini-2.0-flash
14-
EYRIE_CONFIG_DIR=~/.eyrie
18+
19+
# Optional: inject custom HTTP headers into every provider request
20+
# FLUX_CUSTOM_HEADERS="X-Custom: value1\nX-Other: value2"
21+
22+
# Model catalog (dynamic discovery)
23+
# FLUX_MODEL_CATALOG_URL=
24+
# FLUX_MODEL_CATALOG_PATH=
25+
# FLUX_MODEL_CATALOG_REFRESH=
26+
27+
# OpenAI-compatible dynamic provider opt-in (1/true/yes)
28+
# FLUX_ALLOW_DYNAMIC_PROVIDERS=
29+
30+
# Local config/state directory
31+
FLUX_CONFIG_DIR=~/.flux

‎.github/CODEOWNERS‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# CODEOWNERS for eyrie (code-generation engine)
1+
# CODEOWNERS for flux (universal LLM provider runtime)
22
* @GrayCodeAI/maintainers
33

44
# Engine core

‎.github/ISSUE_TEMPLATE/bug_report.yml‎

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ body:
1111
of the form as you can — the more we know, the faster we can fix it.
1212
1313
Before submitting:
14-
- Search [existing issues](https://github.com/GrayCodeAI/eyrie/issues) to avoid duplicates.
14+
- Search [existing issues](https://github.com/GrayCodeAI/flux/issues) to avoid duplicates.
1515
- If this is a security issue, please **do not** file a public issue. See `SECURITY.md`.
1616
1717
- type: textarea
1818
id: what-happened
1919
attributes:
2020
label: What happened?
2121
description: A clear, concise description of the bug.
22-
placeholder: When I call `eyrieClient.Chat(...)` against <provider>, I expected X but got Y.
22+
placeholder: When I call `FluxClient.Chat(...)` against <provider>, I expected X but got Y.
2323
validations:
2424
required: true
2525

@@ -30,8 +30,10 @@ body:
3030
description: Minimal Go snippet (or curl/CLI invocation) that reliably reproduces the problem.
3131
render: go
3232
placeholder: |
33-
client := eyrie.New(...)
34-
resp, err := client.Chat(ctx, msgs, eyrie.ChatOptions{Model: "..."})
33+
client := client.Client(&client.FluxConfig{
34+
Provider: client.DetectProvider(),
35+
})
36+
resp, err := client.Chat(ctx, msgs, client.ChatOptions{Model: "..."})
3537
// ^ panics / returns wrong shape / hangs / etc.
3638
validations:
3739
required: true
@@ -68,10 +70,10 @@ body:
6870
placeholder: "claude-opus-4-20250514"
6971

7072
- type: input
71-
id: eyrie-version
73+
id: flux-version
7274
attributes:
73-
label: eyrie version
74-
description: Output of `eyrie version` or the `eyrie.Version` constant / git SHA you built from.
75+
label: flux version
76+
description: Output of `flux version` or the `flux.Version` constant / git SHA you built from.
7577
placeholder: "0.1.0"
7678
validations:
7779
required: true

‎.github/ISSUE_TEMPLATE/config.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
blank_issues_enabled: false
22
contact_links:
33
- name: Security vulnerability
4-
url: https://github.com/GrayCodeAI/eyrie/security/advisories/new
4+
url: https://github.com/GrayCodeAI/flux/security/advisories/new
55
about: Please report security issues privately via a GitHub Security Advisory. See SECURITY.md.
66
- name: Question / discussion
7-
url: https://github.com/GrayCodeAI/eyrie/discussions
7+
url: https://github.com/GrayCodeAI/flux/discussions
88
about: Have a question or want to discuss an idea? Open a discussion instead of an issue.

‎.github/ISSUE_TEMPLATE/feature_request.yml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ body:
77
- type: markdown
88
attributes:
99
value: |
10-
Thanks for proposing a feature. eyrie is the LLM client + skill router
10+
Thanks for proposing a feature. flux is the LLM client + skill router
1111
that backs the hawk-eco ecosystem. Every feature is evaluated against
1212
whether it serves **a single developer** running an AI agent locally.
1313
1414
Before submitting:
15-
- Search [existing issues](https://github.com/GrayCodeAI/eyrie/issues) to avoid duplicates.
15+
- Search [existing issues](https://github.com/GrayCodeAI/flux/issues) to avoid duplicates.
1616
- For new providers, please open a discussion first — adding a provider
1717
is a long-term maintenance commitment.
1818
@@ -39,15 +39,15 @@ body:
3939
attributes:
4040
label: What problem are you trying to solve?
4141
description: Describe the user problem first. Solutions can come later.
42-
placeholder: When I'm doing X, eyrie makes me do Y, which costs Z extra tokens / a goroutine leak / ...
42+
placeholder: When I'm doing X, flux makes me do Y, which costs Z extra tokens / a goroutine leak / ...
4343
validations:
4444
required: true
4545

4646
- type: textarea
4747
id: proposal
4848
attributes:
4949
label: Proposed solution
50-
description: How would you like eyrie to behave? Snippet of API / config / CLI you'd want.
50+
description: How would you like flux to behave? Snippet of API / config / CLI you'd want.
5151
render: go
5252
validations:
5353
required: true
@@ -62,7 +62,7 @@ body:
6262
id: principles
6363
attributes:
6464
label: Developer fit
65-
description: eyrie avoids enterprise scope. Confirm this feature respects that.
65+
description: flux avoids enterprise scope. Confirm this feature respects that.
6666
options:
6767
- label: Works with zero configuration (sensible defaults).
6868
- label: Does not require a network call to a hawk-eco service.

‎.github/workflows/release.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# Release workflow for eyrie (Go library — no binaries).
1+
# Release workflow for flux (Go library — no binaries).
22
# Triggered when a v* tag is pushed; publishes a GitHub Release with
33
# auto-generated notes. Consumers depend on the tag via
4-
# `go get github.com/GrayCodeAI/eyrie@vX.Y.Z`.
4+
# `go get github.com/GrayCodeAI/flux@vX.Y.Z`.
55

66
name: release
77

‎.gitignore‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
# Binaries
2-
/eyrie
3-
/basic
2+
/flux
43
bin/
54
*.exe
65
*.test

‎AGENTS.md‎

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# AGENTS.md — Eyrie
1+
# AGENTS.md — Flux
22

33
Universal LLM provider runtime. One interface for every model. Authentication, routing, streaming, retries, caching — handled.
44

@@ -9,7 +9,7 @@ When starting any new work (feature, fix, refactor, chore), always create a feat
99
## Design Principles
1010

1111
- **Model-agnostic** — single interface for 75+ LLM providers
12-
- **Host-neutral engine** — Eyrie owns provider routing, transport, caching,
12+
- **Host-neutral engine** — Flux owns provider routing, transport, caching,
1313
retry/fallback, and normalized telemetry; hosts own product UX and semantics
1414
- **Streaming-first** — all responses are streamed; blocking is opt-in
1515

@@ -59,34 +59,34 @@ make ci # Full CI suite
5959
consumers; preserve its method set and the facade's type identity
6060
- Streaming tests need careful goroutine management
6161
- `go.work` here should stay minimal; the parent `graycode-eco/go.work`
62-
connects this independent `eyrie` checkout beside Hawk for local development.
62+
connects this independent `flux` checkout beside Hawk for local development.
6363
Do not add extra local `replace` directives here without coordinating with
6464
the parent workspace.
6565

6666
## Naming Conventions
6767

6868
- **Provider interface**: `client.Provider` with `Chat()`, `StreamChat()`, `Ping()`, `Name()` — implemented per LLM vendor
69-
- **Client types**: `EyrieClient`, `EyrieMessage`, `EyrieResponse`, `EyrieTool`, `EyrieUsage` — `Eyrie` prefix for public types
70-
- **Config struct**: `EyrieConfig` with `Provider`, `APIKey`, `BaseURL`, `Model`, `MaxRetries` fields
69+
- **Client types**: `FluxClient`, `FluxMessage`, `FluxResponse`, `FluxTool`, `FluxUsage` — `Flux` prefix for public types
70+
- **Config struct**: `FluxConfig` with `Provider`, `APIKey`, `BaseURL`, `Model`, `MaxRetries` fields
7171
- **Provider implementations**: `AnthropicClient`, `OpenAIClient`, `GeminiClient`, `BedrockClient`, etc. — in `client/` package
7272
- **Compatibility configs**: `OpenAICompat`, `GrokCompat`, `OpenRouterCompat` — `Compat` suffix for provider quirks
73-
- **Error type**: `EyrieError` with `Provider`, `Op`, `StatusCode`, `RequestID`, `Message`, `Err` fields
73+
- **Error type**: `FluxError` with `Provider`, `Op`, `StatusCode`, `RequestID`, `Message`, `Err` fields
7474
- **Stream types**: `StreamResult`, `SSEEvent`, `StreamEvent` — streaming is SSE-based
7575
- **Retry config**: `RetryConfig` embeds `types.RetryConfig` + adds `RetryOn []int` for HTTP status codes
7676
- **Version wiring**: `client.Version` set via `SetVersion()` from root package — avoids circular import
7777

7878
## API Patterns
7979

8080
- **Provider auto-detection**: `DetectProvider()` checks env vars in priority order (ANTHROPIC_API_KEY, OPENAI_API_KEY, etc.)
81-
- **Client creation**: `client.NewEyrieClient(&EyrieConfig{...})` or `client.Client(&EyrieConfig{...})` — both work
82-
- **Chat method**: `c.Chat(ctx, messages, opts)` — non-streaming, returns `*EyrieResponse`
81+
- **Client creation**: `client.NewFluxClient(&FluxConfig{...})` or `client.Client(&FluxConfig{...})` — both work
82+
- **Chat method**: `c.Chat(ctx, messages, opts)` — non-streaming, returns `*FluxResponse`
8383
- **Stream method**: `c.StreamChat(ctx, messages, opts)` — returns `*StreamResult`, caller must `defer sr.Close()`
8484
- **Auto-continuation**: `StreamChatContinue()` transparently retries when `stop_reason == max_tokens`
8585
- **Provider fallback**: `fallback.go` implements fallback chains across providers
8686
- **Rate limiting**: `ratelimit.go` implements token bucket per provider — prevents hitting API limits
8787
- **Semantic caching**: `semantic_cache.go` caches similar prompts — optional, configurable TTL
8888
- **Retry with backoff**: `retry.go` — exponential backoff + jitter, respects `Retry-After` header, retries on 429/500/502/503/529
89-
- **Error hierarchy**: `EyrieError` has `IsRetriable()`, `IsAuthError()`, `IsRateLimited()` methods for programmatic handling
89+
- **Error hierarchy**: `FluxError` has `IsRetriable()`, `IsAuthError()`, `IsRateLimited()` methods for programmatic handling
9090
- **SSE parsing**: `parseSSEStream()` reads `bufio.Scanner` with 2MB buffer, emits `SSEEvent` to channel
9191

9292
## Testing Patterns
@@ -109,17 +109,17 @@ make ci # Full CI suite
109109
- **Safe to refactor**: `fallback.go`, `weighted.go` — routing strategies, extend with new strategies
110110
- **Safe to refactor**: `cost_estimator.go`, `cache_analytics.go` — metrics and tracking
111111
- **Do not touch**: `Provider` interface (`Chat`, `StreamChat`, `Ping`, `Name`) — breaking change for all implementations
112-
- **Do not touch**: `EyrieMessage`, `EyrieResponse`, `ChatOptions` struct field names — serialization contract
113-
- **Do not touch**: `EyrieError` struct — used by consumers for error type assertions
114-
- **Do not touch**: `client.EyrieConfig` — constructor contract for all consumers
112+
- **Do not touch**: `FluxMessage`, `FluxResponse`, `ChatOptions` struct field names — serialization contract
113+
- **Do not touch**: `FluxError` struct — used by consumers for error type assertions
114+
- **Do not touch**: `client.FluxConfig` — constructor contract for all consumers
115115
- **Safe to extend**: add new provider implementations, new SSE event types, new cache strategies
116116
- **When adding a provider**: create `client/<provider>.go`, implement `Provider` interface, register in `provider_registry.go`
117117

118118
## Key File Locations
119119

120120
| What | Where |
121121
|---|---|
122-
| Provider interface | `client/client.go` (`Provider`, `EyrieConfig`, `EyrieMessage`, `ContentPart`) |
122+
| Provider interface | `client/client.go` (`Provider`, `FluxConfig`, `FluxMessage`, `ContentPart`) |
123123
| Chat implementation | `client/chat.go` (`Chat()`, `StreamChat()`, `StreamChatContinue()`) |
124124
| Host-facing engine facade | `engine/` |
125125
| Provider-neutral core | `client/core/` |
@@ -137,7 +137,7 @@ make ci # Full CI suite
137137
| Caching | `client/cache.go`, `client/semantic_cache.go`, `client/cache_analytics.go` |
138138
| Fallback chains | `client/fallback.go` |
139139
| Auto-continuation | `client/continuation.go` |
140-
| Error types | `client/errors.go` (`EyrieError`, `IsRetriable()`, `IsAuthError()`) |
140+
| Error types | `client/errors.go` (`FluxError`, `IsRetriable()`, `IsAuthError()`) |
141141
| Error constants | `errors/errors.go` (API error messages, prompt-too-long parsing) |
142142
| Model catalog | `catalog/` (pricing, context windows, capabilities per provider) |
143143
| Credentials | `credentials/` (key storage, env detection, scrubbing) — `HasSecret` is silent on miss (boolean predicate); `LookupSecret` logs `Debug` on `ErrNotFound` and `Warn` on real backend errors |
@@ -146,6 +146,6 @@ make ci # Full CI suite
146146
| Linter config | `.golangci.yml` (govet, ineffassign, misspell — minimal) |
147147

148148
This is an independent repository consumed by Hawk. In the local
149-
`graycode-eco` parent workspace it is checked out beside `hawk` as `../eyrie`
149+
`graycode-eco` parent workspace it is checked out beside `hawk` as `../flux`
150150
and connected through the parent `go.work`; publish changes here, then update
151151
Hawk's module pin through a separate PR.

0 commit comments

Comments
 (0)