()
| 22 | ) |
| 23 | |
| 24 | func main() { |
| 25 | ctx := context.Background() |
| 26 | logger := slog.Make(sloghuman.Sink(os.Stderr)).Leveled(slog.LevelDebug) |
| 27 | |
| 28 | // Initialize SQLite database with WAL mode for better concurrency. |
| 29 | db, err := sql.Open("sqlite", "aibridge.db?_journal_mode=WAL&_busy_timeout=5000") |
| 30 | if err != nil { |
| 31 | logger.Fatal(ctx, "open database", slog.Error(err)) |
| 32 | } |
| 33 | defer db.Close() |
| 34 | db.SetMaxOpenConns(1) // SQLite only supports one writer at a time. |
| 35 | |
| 36 | if err := initSchema(db); err != nil { |
| 37 | logger.Fatal(ctx, "init schema", slog.Error(err)) |
| 38 | } |
| 39 | |
| 40 | recorder, err := NewSQLiteRecorder(db, logger) |
| 41 | if err != nil { |
| 42 | logger.Fatal(ctx, "create recorder", slog.Error(err)) |
| 43 | } |
| 44 | defer recorder.Close() |
| 45 | |
| 46 | // Configure providers. |
| 47 | providers := []aibridge.Provider{ |
| 48 | aibridge.NewAnthropicProvider(aibridge.AnthropicConfig{ |
| 49 | Key: os.Getenv("ANTHROPIC_API_KEY"), |
| 50 | }, nil), |
| 51 | aibridge.NewOpenAIProvider(aibridge.OpenAIConfig{ |
| 52 | Key: os.Getenv("OPENAI_API_KEY"), |
| 53 | }), |
| 54 | } |
| 55 | |
| 56 | // Setup metrics. |
| 57 | reg := prometheus.NewRegistry() |
| 58 | metrics := aibridge.NewMetrics(reg) |
| 59 | |
| 60 | // Setup tracing |
| 61 | tracer := otel.GetTracerProvider().Tracer("exampleTracer") |
| 62 | |
| 63 | // Optional: Configure MCP server for centralized tool injection. |
| 64 | // DeepWiki provides free access to public GitHub repo documentation. |
| 65 | // See: https://mcp.deepwiki.com |
| 66 | var mcpProxy mcp.ServerProxier |
| 67 | |
| 68 | deepwikiProxy, err := mcp.NewStreamableHTTPServerProxy( |
| 69 | "deepwiki", // server name (tools prefixed as bmcp_deepwiki_*) |
| 70 | "https://mcp.deepwiki.com/mcp", // no auth required for public repos |
| 71 | nil, // headers |
| 72 | regexp.MustCompile(`^ask_question$`), // allowlist: only ask_question tool |
| 73 | nil, // denylist |
| 74 | logger.Named("mcp.deepwiki"), |
| 75 | tracer, |
| 76 | ) |
| 77 | if err != nil { |
| 78 | logger.Fatal(ctx, "create deepwiki mcp proxy", slog.Error(err)) |
| 79 | } |
| 80 | |
| 81 | mcpProxy = mcp.NewServerProxyManager(map[string]mcp.ServerProxier{"deepwiki": deepwikiProxy}, tracer) |
nothing calls this directly
no test coverage detected