Skip to content

Commit b1b1f18

Browse files
committed
refactor(skills): consolidate lobster-use skill references and update config/CLI
- Consolidate 6 skill reference files into 2 (cli-reference, agent-patterns) - Update lobster-dev MANIFEST - Add banner asset - Update provider setup and init commands
1 parent 03fa661 commit b1b1f18

File tree

17 files changed

+737
-1883
lines changed

17 files changed

+737
-1883
lines changed

.planning/STATE.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
gsd_state_version: 1.0
33
milestone: v1.0
44
milestone_name: milestone
5-
status: in-progress
5+
status: completed
66
stopped_at: Completed 05-01-PLAN.md (LLM-driven component selection)
7-
last_updated: "2026-03-07T07:56:37Z"
7+
last_updated: "2026-03-07T08:00:29.636Z"
88
last_activity: 2026-03-07 -- Completed 05-01 LLM-driven component selection
99
progress:
1010
total_phases: 5
11-
completed_phases: 4
11+
completed_phases: 5
1212
total_plans: 10
1313
completed_plans: 10
1414
percent: 100

README.md

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,5 @@
11
<div align="center">
2-
<table border="0" cellspacing="0" cellpadding="0" style="border: none; background: transparent;">
3-
<tr>
4-
<td valign="middle" style="border: none; background: transparent;">
5-
<img alt="Lobster AI Logo" src="https://raw.githubusercontent.com/the-omics-os/lobster/main/docs/assets/lobster-logo.png" width="80">
6-
</td>
7-
<td valign="middle" align="left" style="border: none; background: transparent; padding-left: 18px;">
8-
<b>Open-source multi-agent bioinformatics engine.<br/>Describe your analysis in natural language.</b>
9-
</td>
10-
</tr>
11-
</table>
2+
<img alt="Lobster AI Banner" src="https://raw.githubusercontent.com/the-omics-os/lobster/main/docs/assets/banner.png" width="700">
123
</div>
134

145
<br/>

docs/assets/banner.png

221 KB
Loading

lobster/cli.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,15 @@ def init(
821821
openai_key: Optional[str] = typer.Option(
822822
None, "--openai-key", help="OpenAI API key (non-interactive mode)"
823823
),
824+
openrouter_key: Optional[str] = typer.Option(
825+
None, "--openrouter-key", help="OpenRouter API key (non-interactive mode)"
826+
),
827+
azure_endpoint: Optional[str] = typer.Option(
828+
None, "--azure-endpoint", help="Azure AI endpoint URL (non-interactive mode)"
829+
),
830+
azure_credential: Optional[str] = typer.Option(
831+
None, "--azure-credential", help="Azure AI API credential (non-interactive mode)"
832+
),
824833
profile: Optional[str] = typer.Option(
825834
None,
826835
"--profile",
@@ -946,13 +955,20 @@ def init(
946955
lobster init --non-interactive \\
947956
--anthropic-key=sk-ant-xxx \\
948957
--cloud-key=cloud_xxx # CI/CD: With cloud access
958+
lobster init --non-interactive \\
959+
--openrouter-key=sk-or-xxx # CI/CD: OpenRouter (600+ models)
960+
lobster init --non-interactive \\
961+
--azure-endpoint=https://xxx.inference.ai.azure.com/ \\
962+
--azure-credential=xxx # CI/CD: Azure AI
949963
"""
950964
from lobster.cli_internal.commands.heavy.init_commands import init_impl
951965
init_impl(
952966
global_config=global_config, force=force, non_interactive=non_interactive,
953967
anthropic_key=anthropic_key, bedrock_access_key=bedrock_access_key,
954968
bedrock_secret_key=bedrock_secret_key, use_ollama=use_ollama,
955969
ollama_model=ollama_model, gemini_key=gemini_key, openai_key=openai_key,
970+
openrouter_key=openrouter_key, azure_endpoint=azure_endpoint,
971+
azure_credential=azure_credential,
956972
profile=profile, ncbi_key=ncbi_key, cloud_key=cloud_key,
957973
cloud_endpoint=cloud_endpoint, skip_ssl_test=skip_ssl_test,
958974
ssl_verify=ssl_verify, ssl_cert_path=ssl_cert_path, agents=agents,

lobster/cli_internal/commands/heavy/init_commands.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1376,6 +1376,15 @@ def init_impl(
13761376
openai_key: Optional[str] = typer.Option(
13771377
None, "--openai-key", help="OpenAI API key (non-interactive mode)"
13781378
),
1379+
openrouter_key: Optional[str] = typer.Option(
1380+
None, "--openrouter-key", help="OpenRouter API key (non-interactive mode)"
1381+
),
1382+
azure_endpoint: Optional[str] = typer.Option(
1383+
None, "--azure-endpoint", help="Azure AI endpoint URL (non-interactive mode)"
1384+
),
1385+
azure_credential: Optional[str] = typer.Option(
1386+
None, "--azure-credential", help="Azure AI API credential (non-interactive mode)"
1387+
),
13791388
profile: Optional[str] = typer.Option(
13801389
None,
13811390
"--profile",
@@ -1501,6 +1510,11 @@ def init_impl(
15011510
lobster init --non-interactive \\
15021511
--anthropic-key=sk-ant-xxx \\
15031512
--cloud-key=cloud_xxx # CI/CD: With cloud access
1513+
lobster init --non-interactive \\
1514+
--openrouter-key=sk-or-xxx # CI/CD: OpenRouter (600+ models)
1515+
lobster init --non-interactive \\
1516+
--azure-endpoint=https://xxx.inference.ai.azure.com/ \\
1517+
--azure-credential=xxx # CI/CD: Azure AI
15041518
"""
15051519
import datetime
15061520

@@ -1625,10 +1639,13 @@ def init_impl(
16251639
has_ollama = use_ollama
16261640
has_gemini = gemini_key is not None
16271641
has_openai = openai_key is not None
1642+
has_openrouter = openrouter_key is not None
1643+
has_azure = azure_endpoint is not None and azure_credential is not None
16281644

16291645
# Validate at least one provider
16301646
valid, error_msg = provider_setup.validate_provider_choice(
1631-
has_anthropic, has_bedrock, has_ollama, has_gemini, has_openai
1647+
has_anthropic, has_bedrock, has_ollama, has_gemini, has_openai,
1648+
has_openrouter=has_openrouter, has_azure=has_azure,
16321649
)
16331650
if not valid:
16341651
console.print(f"[red]❌ Error: {error_msg}[/red]")
@@ -1641,11 +1658,16 @@ def init_impl(
16411658
console.print(" • Ollama (Local): --use-ollama")
16421659
console.print(" • Google Gemini: --gemini-key=xxx")
16431660
console.print(" • OpenAI: --openai-key=xxx")
1661+
console.print(" • OpenRouter: --openrouter-key=xxx")
1662+
console.print(
1663+
" • Azure AI: --azure-endpoint=xxx --azure-credential=xxx"
1664+
)
16441665
raise typer.Exit(1)
16451666

16461667
# Warn if multiple providers
16471668
priority_warning = provider_setup.get_provider_priority_warning(
1648-
has_anthropic, has_bedrock, has_ollama, has_gemini, has_openai
1669+
has_anthropic, has_bedrock, has_ollama, has_gemini, has_openai,
1670+
has_openrouter=has_openrouter, has_azure=has_azure,
16491671
)
16501672
if priority_warning:
16511673
console.print(f"[yellow]⚠️ Warning: {priority_warning}[/yellow]")
@@ -1725,6 +1747,20 @@ def init_impl(
17251747
env_lines.append(f"{key}={value}")
17261748
config_dict["provider"] = "openai"
17271749
console.print("[green]✓ OpenAI provider configured[/green]")
1750+
elif has_openrouter:
1751+
config = provider_setup.create_openrouter_config(openrouter_key)
1752+
if config.success:
1753+
for key, value in config.env_vars.items():
1754+
env_lines.append(f"{key}={value}")
1755+
config_dict["provider"] = "openrouter"
1756+
console.print("[green]✓ OpenRouter provider configured[/green]")
1757+
elif has_azure:
1758+
config = provider_setup.create_azure_config(azure_endpoint, azure_credential)
1759+
if config.success:
1760+
for key, value in config.env_vars.items():
1761+
env_lines.append(f"{key}={value}")
1762+
config_dict["provider"] = "azure"
1763+
console.print("[green]✓ Azure AI provider configured[/green]")
17281764

17291765
# Write profile configuration (only for Anthropic/Bedrock)
17301766
if selected_profile:

lobster/config/provider_setup.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ def validate_provider_choice(
404404
has_ollama: bool,
405405
has_gemini: bool = False,
406406
has_openai: bool = False,
407+
has_openrouter: bool = False,
408+
has_azure: bool = False,
407409
) -> Tuple[bool, Optional[str]]:
408410
"""
409411
Validate that at least one provider is configured.
@@ -414,6 +416,8 @@ def validate_provider_choice(
414416
has_ollama: Whether Ollama is selected
415417
has_gemini: Whether Gemini API key is provided
416418
has_openai: Whether OpenAI API key is provided
419+
has_openrouter: Whether OpenRouter API key is provided
420+
has_azure: Whether Azure AI credentials are provided
417421
418422
Returns:
419423
Tuple of (valid: bool, error_message: Optional[str])
@@ -424,6 +428,8 @@ def validate_provider_choice(
424428
and not has_ollama
425429
and not has_gemini
426430
and not has_openai
431+
and not has_openrouter
432+
and not has_azure
427433
):
428434
return (
429435
False,
@@ -439,6 +445,8 @@ def get_provider_priority_warning(
439445
has_ollama: bool,
440446
has_gemini: bool = False,
441447
has_openai: bool = False,
448+
has_openrouter: bool = False,
449+
has_azure: bool = False,
442450
) -> Optional[str]:
443451
"""
444452
Get warning message if multiple providers are configured.
@@ -449,18 +457,21 @@ def get_provider_priority_warning(
449457
has_ollama: Whether Ollama is configured
450458
has_gemini: Whether Gemini is configured
451459
has_openai: Whether OpenAI is configured
460+
has_openrouter: Whether OpenRouter is configured
461+
has_azure: Whether Azure AI is configured
452462
453463
Returns:
454464
Optional warning message if multiple providers detected
455465
"""
456466
providers_count = sum(
457-
[has_anthropic, has_bedrock, has_ollama, has_gemini, has_openai]
467+
[has_anthropic, has_bedrock, has_ollama, has_gemini, has_openai,
468+
has_openrouter, has_azure]
458469
)
459470

460471
if providers_count <= 1:
461472
return None
462473

463-
# Return priority order message (Anthropic > Bedrock > Gemini > OpenAI > Ollama)
474+
# Return priority order message
464475
if has_anthropic:
465476
return "Multiple providers specified. Using Claude API (highest priority)."
466477
elif has_bedrock:
@@ -469,7 +480,11 @@ def get_provider_priority_warning(
469480
return "Multiple providers specified. Using Gemini (third priority)."
470481
elif has_openai:
471482
return "Multiple providers specified. Using OpenAI (fourth priority)."
483+
elif has_openrouter:
484+
return "Multiple providers specified. Using OpenRouter (fifth priority)."
485+
elif has_azure:
486+
return "Multiple providers specified. Using Azure AI (sixth priority)."
472487
elif has_ollama:
473-
return "Multiple providers specified. Using Ollama (fifth priority)."
488+
return "Multiple providers specified. Using Ollama (seventh priority)."
474489

475490
return None

skills/lobster-dev/MANIFEST

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
SKILL.md
2-
scripts/validate_plugin.py
3-
references/scaffold.md
4-
references/aquadif-contract.md
5-
references/aquadif-migration.md
62
references/architecture.md
7-
references/bioskills-bridge.md
83
references/code-layout.md
94
references/creating-agents.md
105
references/creating-services.md
6+
references/testing.md
7+
references/scaffold.md
8+
references/aquadif-contract.md
119
references/planning-workflow.md
1210
references/plugin-architecture.md
13-
references/testing.md
11+
references/bioskills-bridge.md
12+
scripts/validate_plugin.py

skills/lobster-use/MANIFEST

Lines changed: 0 additions & 7 deletions
This file was deleted.

0 commit comments

Comments
 (0)