mirror of
https://github.com/danielmiessler/Fabric.git
synced 2026-01-09 22:38:10 -05:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83139a64d5 | ||
|
|
78fd836532 | ||
|
|
894459ddec | ||
|
|
920c22c889 | ||
|
|
a0f931feb0 | ||
|
|
4b080fd6dd | ||
|
|
298abecb3f | ||
|
|
e2d4aab775 | ||
|
|
17cac13584 | ||
|
|
e4a004cf88 | ||
|
|
fcb10feadd | ||
|
|
9560537730 | ||
|
|
42fabab352 | ||
|
|
895ca1ad99 | ||
|
|
2ef7db8bb2 |
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -24,6 +24,7 @@
|
||||
"compadd",
|
||||
"compdef",
|
||||
"compinit",
|
||||
"conceptmap",
|
||||
"creatordate",
|
||||
"curcontext",
|
||||
"custompatterns",
|
||||
@@ -95,6 +96,7 @@
|
||||
"joho",
|
||||
"kballard",
|
||||
"Keploy",
|
||||
"kimi",
|
||||
"Kore",
|
||||
"ksylvan",
|
||||
"Langdock",
|
||||
@@ -150,6 +152,7 @@
|
||||
"Pulcherrima",
|
||||
"pycache",
|
||||
"pyperclip",
|
||||
"qwen",
|
||||
"readystream",
|
||||
"restapi",
|
||||
"rmextension",
|
||||
|
||||
41
CHANGELOG.md
41
CHANGELOG.md
@@ -1,5 +1,46 @@
|
||||
# Changelog
|
||||
|
||||
## v1.4.338 (2025-12-04)
|
||||
|
||||
### PR [#1852](https://github.com/danielmiessler/Fabric/pull/1852) by [ksylvan](https://github.com/ksylvan): Add Abacus vendor for ChatLLM models with static model list
|
||||
|
||||
- Add static model support and register Abacus provider
|
||||
- Detect modelsURL starting with 'static:' and route appropriately
|
||||
- Implement getStaticModels returning curated Abacus model list
|
||||
- Register Abacus provider with ModelsURL 'static:abacus'
|
||||
- Extend provider tests to include Abacus existence
|
||||
|
||||
## v1.4.337 (2025-12-04)
|
||||
|
||||
### PR [#1851](https://github.com/danielmiessler/Fabric/pull/1851) by [ksylvan](https://github.com/ksylvan): Add Z AI provider and glm model support
|
||||
|
||||
- Add Z AI provider configuration to ProviderMap
|
||||
- Include BaseURL for Z AI API endpoint
|
||||
- Add test case for Z AI provider existence
|
||||
- Add glm to OpenAI model prefixes list
|
||||
- Support new Z AI provider in OpenAI compatible plugins
|
||||
|
||||
## v1.4.336 (2025-12-01)
|
||||
|
||||
### PR [#1848](https://github.com/danielmiessler/Fabric/pull/1848) by [zeddy303](https://github.com/zeddy303): Fix localStorage SSR error in favorites-store
|
||||
|
||||
- Fix localStorage SSR error in favorites-store by using SvelteKit's browser constant instead of typeof localStorage check to properly handle server-side rendering and prevent 'localStorage.getItem is not a function' error when running dev server
|
||||
|
||||
## v1.4.335 (2025-11-28)
|
||||
|
||||
### PR [#1847](https://github.com/danielmiessler/Fabric/pull/1847) by [ksylvan](https://github.com/ksylvan): Improve model name matching for NeedsRaw in Ollama plugin
|
||||
|
||||
- Improved model name matching in Ollama plugin by replacing prefix-based matching with substring matching
|
||||
- Enhanced NeedsRaw functionality to support more flexible model name detection
|
||||
- Renamed `ollamaPrefixes` variable to `ollamaSearchStrings` for better code clarity
|
||||
- Replaced `HasPrefix` function with `Contains` for more comprehensive model matching
|
||||
- Added "conceptmap" to VSCode dictionary settings
|
||||
|
||||
### Direct commits
|
||||
|
||||
- Merge branch 'danielmiessler:main' into main
|
||||
- Docs: Fix typo in README
|
||||
|
||||
## v1.4.334 (2025-11-26)
|
||||
|
||||
### PR [#1845](https://github.com/danielmiessler/Fabric/pull/1845) by [ksylvan](https://github.com/ksylvan): Add Claude Opus 4.5 Support
|
||||
|
||||
@@ -73,7 +73,10 @@ Below are the **new features and capabilities** we've added (newest first):
|
||||
|
||||
### Recent Major Features
|
||||
|
||||
- [v1.4.334](https://github.com/danielmiessler/fabric/releases/tag/v1.4.334) (Nov 26, 2025) — **Claude Opus 4.5s**: Updates the Anthropic SDK to the latest and adds the new [Claude Opus 4.5](https://www.anthropic.com/news/claude-opus-4-5) to the available models.
|
||||
- [v1.4.338](https://github.com/danielmiessler/fabric/releases/tag/v1.4.338) (Dec 4, 2025) — Add Abacus vendor support for Chat-LLM
|
||||
models (see [RouteLLM APIs](https://abacus.ai/app/route-llm-apis)).
|
||||
- [v1.4.337](https://github.com/danielmiessler/fabric/releases/tag/v1.4.337) (Dec 4, 2025) — Add "Z AI" vendor support. See the [Z AI overview](https://docs.z.ai/guides/overview/overview) page for more details.
|
||||
- [v1.4.334](https://github.com/danielmiessler/fabric/releases/tag/v1.4.334) (Nov 26, 2025) — **Claude Opus 4.5**: Updates the Anthropic SDK to the latest and adds the new [Claude Opus 4.5](https://www.anthropic.com/news/claude-opus-4-5) to the available models.
|
||||
- [v1.4.331](https://github.com/danielmiessler/fabric/releases/tag/v1.4.331) (Nov 23, 2025) — **Support for GitHub Models**: Adds support for using GitHub Models.
|
||||
- [v1.4.322](https://github.com/danielmiessler/fabric/releases/tag/v1.4.322) (Nov 5, 2025) — **Interactive HTML Concept Maps and Claude Sonnet 4.5**: Adds `create_conceptmap` pattern for visual knowledge representation using Vis.js, introduces WELLNESS category with psychological analysis patterns, and upgrades to Claude Sonnet 4.5
|
||||
- [v1.4.317](https://github.com/danielmiessler/fabric/releases/tag/v1.4.317) (Sep 21, 2025) — **Portuguese Language Variants**: Adds BCP 47 locale normalization with support for Brazilian Portuguese (pt-BR) and European Portuguese (pt-PT) with intelligent fallback chains
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
package main
|
||||
|
||||
var version = "v1.4.334"
|
||||
var version = "v1.4.338"
|
||||
|
||||
Binary file not shown.
@@ -163,13 +163,13 @@ func (o *Client) createChatRequest(msgs []*chat.ChatCompletionMessage, opts *dom
|
||||
}
|
||||
|
||||
func (o *Client) NeedsRawMode(modelName string) bool {
|
||||
ollamaPrefixes := []string{
|
||||
ollamaSearchStrings := []string{
|
||||
"llama3",
|
||||
"llama2",
|
||||
"mistral",
|
||||
}
|
||||
for _, prefix := range ollamaPrefixes {
|
||||
if strings.HasPrefix(modelName, prefix) {
|
||||
for _, searchString := range ollamaSearchStrings {
|
||||
if strings.Contains(modelName, searchString) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -172,10 +172,11 @@ func (o *Client) supportsResponsesAPI() bool {
|
||||
|
||||
func (o *Client) NeedsRawMode(modelName string) bool {
|
||||
openaiModelsPrefixes := []string{
|
||||
"glm",
|
||||
"gpt-5",
|
||||
"o1",
|
||||
"o3",
|
||||
"o4",
|
||||
"gpt-5",
|
||||
}
|
||||
openAIModelsNeedingRaw := []string{
|
||||
"gpt-4o-mini-search-preview",
|
||||
|
||||
@@ -2,6 +2,7 @@ package openai_compatible
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
@@ -38,8 +39,12 @@ func NewClient(providerConfig ProviderConfig) *Client {
|
||||
|
||||
// ListModels overrides the default ListModels to handle different response formats
|
||||
func (c *Client) ListModels() ([]string, error) {
|
||||
// If a custom models URL is provided, use direct fetch with that URL
|
||||
// If a custom models URL is provided, handle it
|
||||
if c.modelsURL != "" {
|
||||
// Check for static model list
|
||||
if strings.HasPrefix(c.modelsURL, "static:") {
|
||||
return c.getStaticModels(c.modelsURL)
|
||||
}
|
||||
// TODO: Handle context properly in Fabric by accepting and propagating a context.Context
|
||||
// instead of creating a new one here.
|
||||
return openai.FetchModelsDirectly(context.Background(), c.modelsURL, c.Client.ApiKey.Value, c.GetName())
|
||||
@@ -55,6 +60,68 @@ func (c *Client) ListModels() ([]string, error) {
|
||||
return c.DirectlyGetModels(context.Background())
|
||||
}
|
||||
|
||||
// getStaticModels returns a predefined list of models for providers that don't support model discovery
|
||||
func (c *Client) getStaticModels(modelsKey string) ([]string, error) {
|
||||
switch modelsKey {
|
||||
case "static:abacus":
|
||||
return []string{
|
||||
"route-llm",
|
||||
"gpt-4o-2024-11-20",
|
||||
"gpt-4o-mini",
|
||||
"o4-mini",
|
||||
"o3-pro",
|
||||
"o3",
|
||||
"o3-mini",
|
||||
"gpt-4.1",
|
||||
"gpt-4.1-mini",
|
||||
"gpt-4.1-nano",
|
||||
"gpt-5",
|
||||
"gpt-5-mini",
|
||||
"gpt-5-nano",
|
||||
"gpt-5.1",
|
||||
"gpt-5.1-chat-latest",
|
||||
"openai/gpt-oss-120b",
|
||||
"claude-3-7-sonnet-20250219",
|
||||
"claude-sonnet-4-20250514",
|
||||
"claude-opus-4-20250514",
|
||||
"claude-opus-4-1-20250805",
|
||||
"claude-sonnet-4-5-20250929",
|
||||
"claude-haiku-4-5-20251001",
|
||||
"claude-opus-4-5-20251101",
|
||||
"meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8",
|
||||
"meta-llama/Meta-Llama-3.1-405B-Instruct-Turbo",
|
||||
"meta-llama/Meta-Llama-3.1-70B-Instruct",
|
||||
"meta-llama/Meta-Llama-3.1-8B-Instruct",
|
||||
"llama-3.3-70b-versatile",
|
||||
"gemini-2.0-flash-001",
|
||||
"gemini-2.0-pro-exp-02-05",
|
||||
"gemini-2.5-pro",
|
||||
"gemini-2.5-flash",
|
||||
"gemini-3-pro-preview",
|
||||
"qwen-2.5-coder-32b",
|
||||
"Qwen/Qwen2.5-72B-Instruct",
|
||||
"Qwen/QwQ-32B",
|
||||
"Qwen/Qwen3-235B-A22B-Instruct-2507",
|
||||
"Qwen/Qwen3-32B",
|
||||
"qwen/qwen3-coder-480b-a35b-instruct",
|
||||
"qwen/qwen3-Max",
|
||||
"grok-4-0709",
|
||||
"grok-4-fast-non-reasoning",
|
||||
"grok-4-1-fast-non-reasoning",
|
||||
"grok-code-fast-1",
|
||||
"kimi-k2-turbo-preview",
|
||||
"deepseek/deepseek-v3.1",
|
||||
"deepseek-ai/DeepSeek-V3.1-Terminus",
|
||||
"deepseek-ai/DeepSeek-R1",
|
||||
"deepseek-ai/DeepSeek-V3.2",
|
||||
"zai-org/glm-4.5",
|
||||
"zai-org/glm-4.6",
|
||||
}, nil
|
||||
default:
|
||||
return nil, fmt.Errorf("unknown static model list: %s", modelsKey)
|
||||
}
|
||||
}
|
||||
|
||||
// ProviderMap is a map of provider name to ProviderConfig for O(1) lookup
|
||||
var ProviderMap = map[string]ProviderConfig{
|
||||
"AIML": {
|
||||
@@ -123,6 +190,17 @@ var ProviderMap = map[string]ProviderConfig{
|
||||
BaseURL: "https://api.venice.ai/api/v1",
|
||||
ImplementsResponses: false,
|
||||
},
|
||||
"Z AI": {
|
||||
Name: "Z AI",
|
||||
BaseURL: "https://api.z.ai/api/paas/v4",
|
||||
ImplementsResponses: false,
|
||||
},
|
||||
"Abacus": {
|
||||
Name: "Abacus",
|
||||
BaseURL: "https://routellm.abacus.ai/v1/",
|
||||
ModelsURL: "static:abacus", // Special marker for static model list
|
||||
ImplementsResponses: false,
|
||||
},
|
||||
}
|
||||
|
||||
// GetProviderByName returns the provider configuration for a given name with O(1) lookup
|
||||
|
||||
@@ -20,6 +20,16 @@ func TestCreateClient(t *testing.T) {
|
||||
provider: "Groq",
|
||||
exists: true,
|
||||
},
|
||||
{
|
||||
name: "Existing provider - Z AI",
|
||||
provider: "Z AI",
|
||||
exists: true,
|
||||
},
|
||||
{
|
||||
name: "Existing provider - Abacus",
|
||||
provider: "Abacus",
|
||||
exists: true,
|
||||
},
|
||||
{
|
||||
name: "Non-existent provider",
|
||||
provider: "NonExistent",
|
||||
|
||||
@@ -1 +1 @@
|
||||
"1.4.334"
|
||||
"1.4.338"
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import { writable } from 'svelte/store';
|
||||
import { browser } from '$app/environment';
|
||||
|
||||
// Load favorites from localStorage if available
|
||||
const storedFavorites = typeof localStorage !== 'undefined'
|
||||
const storedFavorites = browser
|
||||
? JSON.parse(localStorage.getItem('favoritePatterns') || '[]')
|
||||
: [];
|
||||
|
||||
const createFavoritesStore = () => {
|
||||
const { subscribe, set, update } = writable<string[]>(storedFavorites);
|
||||
|
||||
|
||||
return {
|
||||
subscribe,
|
||||
toggleFavorite: (patternName: string) => {
|
||||
@@ -17,7 +18,7 @@ const createFavoritesStore = () => {
|
||||
: [...favorites, patternName];
|
||||
|
||||
// Save to localStorage
|
||||
if (typeof localStorage !== 'undefined') {
|
||||
if (browser) {
|
||||
localStorage.setItem('favoritePatterns', JSON.stringify(newFavorites));
|
||||
}
|
||||
|
||||
@@ -26,11 +27,11 @@ const createFavoritesStore = () => {
|
||||
},
|
||||
reset: () => {
|
||||
set([]);
|
||||
if (typeof localStorage !== 'undefined') {
|
||||
if (browser) {
|
||||
localStorage.removeItem('favoritePatterns');
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
export const favorites = createFavoritesStore();
|
||||
export const favorites = createFavoritesStore();
|
||||
|
||||
Reference in New Issue
Block a user