Module: Mistri
- Defined in:
- lib/mistri.rb,
lib/mistri/mcp.rb,
lib/mistri/sse.rb,
lib/mistri/edit.rb,
lib/mistri/tool.rb,
lib/mistri/agent.rb,
lib/mistri/event.rb,
lib/mistri/skill.rb,
lib/mistri/tools.rb,
lib/mistri/usage.rb,
lib/mistri/budget.rb,
lib/mistri/errors.rb,
lib/mistri/memory.rb,
lib/mistri/models.rb,
lib/mistri/result.rb,
lib/mistri/schema.rb,
lib/mistri/skills.rb,
lib/mistri/content.rb,
lib/mistri/message.rb,
lib/mistri/session.rb,
lib/mistri/version.rb,
lib/mistri/reminder.rb,
lib/mistri/compactor.rb,
lib/mistri/mcp/oauth.rb,
lib/mistri/mcp/wires.rb,
lib/mistri/sinks/sse.rb,
lib/mistri/sub_agent.rb,
lib/mistri/tool_call.rb,
lib/mistri/transport.rb,
lib/mistri/compaction.rb,
lib/mistri/definition.rb,
lib/mistri/mcp/client.rb,
lib/mistri/stop_reason.rb,
lib/mistri/tool_result.rb,
lib/mistri/abort_signal.rb,
lib/mistri/partial_json.rb,
lib/mistri/retry_policy.rb,
lib/mistri/stores/jsonl.rb,
lib/mistri/tool_context.rb,
lib/mistri/stores/memory.rb,
lib/mistri/tool_executor.rb,
lib/mistri/providers/fake.rb,
lib/mistri/sinks/coalesced.rb,
lib/mistri/tools/edit_file.rb,
lib/mistri/tools/read_file.rb,
lib/mistri/providers/gemini.rb,
lib/mistri/providers/openai.rb,
lib/mistri/tools/list_files.rb,
lib/mistri/tools/write_file.rb,
lib/mistri/workspace/memory.rb,
lib/mistri/workspace/single.rb,
lib/mistri/tools/read_memory.rb,
lib/mistri/sinks/action_cable.rb,
lib/mistri/tools/find_in_file.rb,
lib/mistri/providers/anthropic.rb,
lib/mistri/tools/update_memory.rb,
lib/mistri/workspace/directory.rb,
lib/mistri/stores/active_record.rb,
lib/mistri/workspace/active_record.rb,
lib/mistri/providers/gemini/assembler.rb,
lib/mistri/providers/openai/assembler.rb,
lib/mistri/providers/gemini/serializer.rb,
lib/mistri/providers/openai/serializer.rb,
lib/generators/mistri/mcp/mcp_generator.rb,
lib/mistri/providers/anthropic/assembler.rb,
lib/mistri/providers/anthropic/serializer.rb,
lib/generators/mistri/install/install_generator.rb
Overview
Mistri (مستری): the fixer. An agent harness for Ruby applications.
Defined Under Namespace
Modules: Content, Edit, ErrorData, Generators, MCP, Models, PartialJson, Providers, Sinks, Skills, StopReason, Stores, ToolExecutor, Tools, Workspace Classes: AbortError, AbortSignal, Agent, AuthenticationError, Budget, BudgetError, Compaction, CompactionError, Compactor, ConfigurationError, Definition, EditError, Error, Event, Memory, Message, OverloadedError, ProviderError, RateLimitError, Reminder, Result, RetryPolicy, SSE, Schema, SchemaError, ServerError, Session, Skill, SubAgent, Tool, ToolCall, ToolContext, ToolResult, Transport, Usage
Constant Summary collapse
- PROVIDERS =
{ anthropic: Providers::Anthropic, openai: Providers::OpenAI, gemini: Providers::Gemini }.freeze
- API_KEY_ENV =
{ anthropic: "ANTHROPIC_API_KEY", openai: "OPENAI_API_KEY", gemini: "GEMINI_API_KEY" }.freeze
- VERSION =
"0.4.1"
Class Method Summary collapse
-
.agent(model, api_key: nil, provider_options: {}, **agent_options) ⇒ Object
Build an agent for a model in one call: infers and constructs the provider, then wraps it in the loop.
- .infer_provider_name(model) ⇒ Object
-
.provider(model, api_key: nil) ⇒ Object
Build a provider for a model, inferring which one from the model id and reading its key from the environment unless one is passed.
-
.provider_name(model) ⇒ Object
Catalogued models infer directly; unknown ids fall back to the id prefix, so a brand-new model works before it is catalogued.
Class Method Details
.agent(model, api_key: nil, provider_options: {}, **agent_options) ⇒ Object
Build an agent for a model in one call: infers and constructs the provider, then wraps it in the loop.
agent = Mistri.agent("claude-opus-4-8", tools: [weather], system: "Be brief.")
agent.run("Weather in Lahore?") { |event| ... }
78 79 80 81 |
# File 'lib/mistri.rb', line 78 def agent(model, api_key: nil, provider_options: {}, **) built = provider(model, api_key: api_key, **) Agent.new(provider: built, **) end |
.infer_provider_name(model) ⇒ Object
89 90 91 92 93 94 95 96 |
# File 'lib/mistri.rb', line 89 def infer_provider_name(model) case model.to_s when /\Aclaude/ then :anthropic when /\A(gpt|o\d|chatgpt)/ then :openai when /\Agemini/ then :gemini else raise ConfigurationError, "cannot infer a provider from #{model.inspect}" end end |
.provider(model, api_key: nil) ⇒ Object
64 65 66 67 68 69 70 71 |
# File 'lib/mistri.rb', line 64 def provider(model, api_key: nil, **) name = provider_name(model) klass = PROVIDERS.fetch(name) { raise ConfigurationError, "no provider for #{model.inspect}" } key = api_key || ENV.fetch(API_KEY_ENV.fetch(name), nil) raise ConfigurationError, "no API key for #{name}" if key.to_s.empty? klass.new(api_key: key, model: model, **) end |